--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/pmqtt/client.py 2dcc759c88f3f2471ffcf6146721200a16aadede (2dcc759c) Text, 195.50 KB
T8b949e# Copyright (c) 2012-2019 Roger Light and others
T8b949e#
T8b949e# All rights reserved. This program and the accompanying materials
T8b949e# are made available under the terms of the Eclipse Public License v2.0
T8b949e# and Eclipse Distribution License v1.0 which accompany this distribution.
T8b949e#
T8b949e# The Eclipse Public License is available at
T8b949e# http://www.eclipse.org/legal/epl-v20.html
T8b949e# and the Eclipse Distribution License is available at
T8b949e# http://www.eclipse.org/org/documents/edl-v10.php.
T8b949e#
T8b949e# Contributors:
T8b949e# Roger Light - initial API and implementation
T8b949e# Ian Craggs - MQTT V5 support
T8b949e"""
This is an MQTT client module. MQTT is a lightweight pub/sub messaging
protocol that is easy to implement and suitable for low powered devices.
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787base64
Tff7b72import T7ee787collections
Tff7b72import T7ee787errno
Tff7b72import T7ee787hashlib
Tff7b72import T7ee787logging
Tff7b72import T7ee787os
Tff7b72import T7ee787platform
Tff7b72import T7ee787select
Tff7b72import T7ee787socket
Tff7b72import T7ee787string
Tff7b72import T7ee787struct
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72import T7ee787urllibT7ee787.T7ee787parse
Tff7b72import T7ee787urllibT7ee787.T7ee787request
Tff7b72import T7ee787uuid
Tff7b72import T7ee787warnings
Tff7b72from T7ee787typing Tff7b72import Te6edf3TYPE_CHECKINGTb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3CallableTb4b4b4, Te6edf3DictTb4b4b4, Te6edf3IteratorTb4b4b4, Te6edf3ListTb4b4b4, Te6edf3NamedTupleTb4b4b4, Te6edf3SequenceTb4b4b4, Te6edf3TupleTb4b4b4, Te6edf3UnionTb4b4b4, Te6edf3cast
Tff7b72from T7ee787.T7ee787packettypes Tff7b72import Te6edf3PacketTypes
Tff7b72from T7ee787.T7ee787enums Tff7b72import Te6edf3CallbackAPIVersionTb4b4b4, Te6edf3ConnackCodeTb4b4b4, Te6edf3LogLevelTb4b4b4, Te6edf3MessageStateTb4b4b4, Te6edf3MessageTypeTb4b4b4, Te6edf3MQTTErrorCodeTb4b4b4, Te6edf3MQTTProtocolVersionTb4b4b4, Te6edf3PahoClientModeTb4b4b4, Te6edf3_ConnectionState
Tff7b72from T7ee787.T7ee787matcher Tff7b72import Te6edf3MQTTMatcher
Tff7b72from T7ee787.T7ee787properties Tff7b72import Te6edf3Properties
Tff7b72from T7ee787.T7ee787reasoncodes Tff7b72import Te6edf3ReasonCodeTb4b4b4, Te6edf3ReasonCodes
Tff7b72from T7ee787.T7ee787subscribeoptions Tff7b72import Te6edf3SubscribeOptions
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787typing Tff7b72import Te6edf3Literal
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72from T7ee787typing_extensions Tff7b72import Te6edf3Literal T8b949e# type: ignore
Tff7b72if Te6edf3TYPE_CHECKINGTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787typing Tff7b72import Te6edf3TypedDict T8b949e# type: ignore
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72from T7ee787typing_extensions Tff7b72import Te6edf3TypedDict
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787typing Tff7b72import Te6edf3Protocol T8b949e# type: ignore
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72from T7ee787typing_extensions Tff7b72import Te6edf3Protocol T8b949e# type: ignore
Tff7b72class T56d364_InPacketTb4b4b4(Te6edf3TypedDictTb4b4b4)Tb4b4b4:
Te6edf3commandTb4b4b4: Tffa657int
Te6edf3have_remainingTb4b4b4: Tffa657int
Te6edf3remaining_countTb4b4b4: Tffa657listTb4b4b4[Tffa657intTb4b4b4]
Te6edf3remaining_multTb4b4b4: Tffa657int
Te6edf3remaining_lengthTb4b4b4: Tffa657int
Te6edf3packetTb4b4b4: Tffa657bytearray
Te6edf3to_processTb4b4b4: Tffa657int
Te6edf3posTb4b4b4: Tffa657int
Tff7b72class T56d364_OutPacketTb4b4b4(Te6edf3TypedDictTb4b4b4)Tb4b4b4:
Te6edf3commandTb4b4b4: Tffa657int
Te6edf3midTb4b4b4: Tffa657int
Te6edf3qosTb4b4b4: Tffa657int
Te6edf3posTb4b4b4: Tffa657int
Te6edf3to_processTb4b4b4: Tffa657int
Te6edf3packetTb4b4b4: Tffa657bytes
Te6edf3infoTb4b4b4: Te6edf3MQTTMessageInfo Tff7b72| Tff7b72None
Tff7b72class T56d364SocketLikeTb4b4b4(Te6edf3ProtocolTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffrecvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3buffer_sizeTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72.Tff7b72.Tff7b72.
Tff7b72def Td2a8ffsendTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufferTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72.Tff7b72.Tff7b72.
Tff7b72def Td2a8ffcloseTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72.Tff7b72.Tff7b72.
Tff7b72def Td2a8fffilenoTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72.Tff7b72.Tff7b72.
Tff7b72def Td2a8ffsetblockingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3flagTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72.Tff7b72.Tff7b72.
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787ssl
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3ssl Tff7b72= Tff7b72None T8b949e# type: ignore[assignment]
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787socks T8b949e# type: ignore[import-untyped]
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3socks Tff7b72= Tff7b72None T8b949e# type: ignore[assignment]
Tff7b72tryTb4b4b4:
T8b949e# Use monotonic clock if available
Te6edf3time_func Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonic
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Te6edf3time_func Tff7b72= Te6edf3timeTff7b72.Td2a8fftime
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787dnsT7ee787.T7ee787resolver
Te6edf3HAVE_DNS Tff7b72= Tff7b72True
Tff7b72except Tf85149ImportErrorTb4b4b4:
Te6edf3HAVE_DNS Tff7b72= Tff7b72False
Tff7b72if Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff'Ta5d6ffWindowsTa5d6ff'Tb4b4b4:
Te6edf3EAGAIN Tff7b72= Te6edf3errnoTff7b72.Td2a8ffWSAEWOULDBLOCK T8b949e# type: ignore[attr-defined]
Tff7b72elseTb4b4b4:
Te6edf3EAGAIN Tff7b72= Te6edf3errnoTff7b72.Td2a8ffEAGAIN
T8b949e# Avoid linter complain. We kept importing it as ReasonCodes (plural) for compatibility
Te6edf3_ Tff7b72= Te6edf3ReasonCodes
T8b949e# Keep copy of enums values for compatibility.
Te6edf3CONNECT Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffCONNECT
Te6edf3CONNACK Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffCONNACK
Te6edf3PUBLISH Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPUBLISH
Te6edf3PUBACK Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPUBACK
Te6edf3PUBREC Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPUBREC
Te6edf3PUBREL Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPUBREL
Te6edf3PUBCOMP Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPUBCOMP
Te6edf3SUBSCRIBE Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffSUBSCRIBE
Te6edf3SUBACK Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffSUBACK
Te6edf3UNSUBSCRIBE Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffUNSUBSCRIBE
Te6edf3UNSUBACK Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffUNSUBACK
Te6edf3PINGREQ Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPINGREQ
Te6edf3PINGRESP Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffPINGRESP
Te6edf3DISCONNECT Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffDISCONNECT
Te6edf3AUTH Tff7b72= Te6edf3MessageTypeTff7b72.Td2a8ffAUTH
T8b949e# Log levels
Te6edf3MQTT_LOG_INFO Tff7b72= Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_INFO
Te6edf3MQTT_LOG_NOTICE Tff7b72= Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_NOTICE
Te6edf3MQTT_LOG_WARNING Tff7b72= Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_WARNING
Te6edf3MQTT_LOG_ERR Tff7b72= Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_ERR
Te6edf3MQTT_LOG_DEBUG Tff7b72= Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_DEBUG
Te6edf3LOGGING_LEVEL Tff7b72= Tb4b4b4{
Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_DEBUGTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffDEBUGTb4b4b4,
Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_INFOTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffINFOTb4b4b4,
Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_NOTICETb4b4b4: Te6edf3loggingTff7b72.Td2a8ffINFOTb4b4b4, T8b949e# This has no direct equivalent level
Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_WARNINGTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffWARNINGTb4b4b4,
Te6edf3LogLevelTff7b72.Td2a8ffMQTT_LOG_ERRTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffERRORTb4b4b4,
Tb4b4b4}
T8b949e# CONNACK codes
Te6edf3CONNACK_ACCEPTED Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_ACCEPTED
Te6edf3CONNACK_REFUSED_PROTOCOL_VERSION Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_PROTOCOL_VERSION
Te6edf3CONNACK_REFUSED_IDENTIFIER_REJECTED Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_IDENTIFIER_REJECTED
Te6edf3CONNACK_REFUSED_SERVER_UNAVAILABLE Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_SERVER_UNAVAILABLE
Te6edf3CONNACK_REFUSED_BAD_USERNAME_PASSWORD Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_BAD_USERNAME_PASSWORD
Te6edf3CONNACK_REFUSED_NOT_AUTHORIZED Tff7b72= Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_NOT_AUTHORIZED
T8b949e# Message state
Te6edf3mqtt_ms_invalid Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_INVALID
Te6edf3mqtt_ms_publish Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_PUBLISH
Te6edf3mqtt_ms_wait_for_puback Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_WAIT_FOR_PUBACK
Te6edf3mqtt_ms_wait_for_pubrec Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_WAIT_FOR_PUBREC
Te6edf3mqtt_ms_resend_pubrel Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_RESEND_PUBREL
Te6edf3mqtt_ms_wait_for_pubrel Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_WAIT_FOR_PUBREL
Te6edf3mqtt_ms_resend_pubcomp Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_RESEND_PUBCOMP
Te6edf3mqtt_ms_wait_for_pubcomp Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_WAIT_FOR_PUBCOMP
Te6edf3mqtt_ms_send_pubrec Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_SEND_PUBREC
Te6edf3mqtt_ms_queued Tff7b72= Te6edf3MessageStateTff7b72.Td2a8ffMQTT_MS_QUEUED
Te6edf3MQTT_ERR_AGAIN Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
Te6edf3MQTT_ERR_SUCCESS Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Te6edf3MQTT_ERR_NOMEM Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NOMEM
Te6edf3MQTT_ERR_PROTOCOL Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Te6edf3MQTT_ERR_INVAL Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_INVAL
Te6edf3MQTT_ERR_NO_CONN Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Te6edf3MQTT_ERR_CONN_REFUSED Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_REFUSED
Te6edf3MQTT_ERR_NOT_FOUND Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NOT_FOUND
Te6edf3MQTT_ERR_CONN_LOST Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Te6edf3MQTT_ERR_TLS Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_TLS
Te6edf3MQTT_ERR_PAYLOAD_SIZE Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PAYLOAD_SIZE
Te6edf3MQTT_ERR_NOT_SUPPORTED Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NOT_SUPPORTED
Te6edf3MQTT_ERR_AUTH Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AUTH
Te6edf3MQTT_ERR_ACL_DENIED Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_ACL_DENIED
Te6edf3MQTT_ERR_UNKNOWN Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_UNKNOWN
Te6edf3MQTT_ERR_ERRNO Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_ERRNO
Te6edf3MQTT_ERR_QUEUE_SIZE Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_QUEUE_SIZE
Te6edf3MQTT_ERR_KEEPALIVE Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_KEEPALIVE
Te6edf3MQTTv31 Tff7b72= Te6edf3MQTTProtocolVersionTff7b72.Td2a8ffMQTTv31
Te6edf3MQTTv311 Tff7b72= Te6edf3MQTTProtocolVersionTff7b72.Td2a8ffMQTTv311
Te6edf3MQTTv5 Tff7b72= Te6edf3MQTTProtocolVersionTff7b72.Td2a8ffMQTTv5
Te6edf3MQTT_CLIENT Tff7b72= Te6edf3PahoClientModeTff7b72.Td2a8ffMQTT_CLIENT
Te6edf3MQTT_BRIDGE Tff7b72= Te6edf3PahoClientModeTff7b72.Td2a8ffMQTT_BRIDGE
T8b949e# For MQTT V5, use the clean start flag only on the first successful connect
Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4: Te6edf3CleanStartOption Tff7b72= T79c0ff3
Te6edf3sockpair_data Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff0Ta5d6ff"
T8b949e# Payload support all those type and will be converted to bytes:
T8b949e# * str are utf8 encoded
T8b949e# * int/float are converted to string and utf8 encoded (e.g. 1 is converted to b"1")
T8b949e# * None is converted to a zero-length payload (i.e. b"")
Te6edf3PayloadType Tff7b72= Te6edf3UnionTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4, Tffa657intTb4b4b4, Tffa657floatTb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3HTTPHeader Tff7b72= Te6edf3DictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]
Te6edf3WebSocketHeaders Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3HTTPHeaderTb4b4b4]Tb4b4b4, Te6edf3HTTPHeaderTb4b4b4]Tb4b4b4, Te6edf3HTTPHeaderTb4b4b4]
Te6edf3CleanStartOption Tff7b72= Te6edf3UnionTb4b4b4[Tffa657boolTb4b4b4, Te6edf3LiteralTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4]
Tff7b72class T56d364ConnectFlagsTb4b4b4(Te6edf3NamedTupleTb4b4b4)Tb4b4b4:
T8b949e"""Contains additional information passed to `on_connect` callback"""
Te6edf3session_presentTb4b4b4: Tffa657bool
T8b949e"""
this flag is useful for clients that are
using clean session set to False only (MQTTv3) or clean_start = False (MQTTv5).
In that case, if client that reconnects to a broker that it has previously
connected to, this flag indicates whether the broker still has the
session information for the client. If true, the session still exists.
"""
Tff7b72class T56d364DisconnectFlagsTb4b4b4(Te6edf3NamedTupleTb4b4b4)Tb4b4b4:
T8b949e"""Contains additional information passed to `on_disconnect` callback"""
Te6edf3is_disconnect_packet_from_serverTb4b4b4: Tffa657bool
T8b949e"""
tells whether this on_disconnect call is the result
of receiving an DISCONNECT packet from the broker or if the on_disconnect is only
generated by the client library.
When true, the reason code is generated by the broker.
"""
Te6edf3CallbackOnConnect_v1_mqtt3 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3DictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3MQTTErrorCodeTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnConnect_v1_mqtt5 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3DictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3ReasonCodeTb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnConnect_v1 Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnConnect_v1_mqtt5Tb4b4b4, Te6edf3CallbackOnConnect_v1_mqtt3Tb4b4b4]
Te6edf3CallbackOnConnect_v2 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3ConnectFlagsTb4b4b4, Te6edf3ReasonCodeTb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnConnect Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnConnect_v1Tb4b4b4, Te6edf3CallbackOnConnect_v2Tb4b4b4]
Te6edf3CallbackOnConnectFail Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnDisconnect_v1_mqtt3 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3MQTTErrorCodeTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnDisconnect_v1_mqtt5 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3ReasonCodeTb4b4b4, Tffa657intTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnDisconnect_v1 Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnDisconnect_v1_mqtt3Tb4b4b4, Te6edf3CallbackOnDisconnect_v1_mqtt5Tb4b4b4]
Te6edf3CallbackOnDisconnect_v2 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3DisconnectFlagsTb4b4b4, Te6edf3ReasonCodeTb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnDisconnect Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnDisconnect_v1Tb4b4b4, Te6edf3CallbackOnDisconnect_v2Tb4b4b4]
Te6edf3CallbackOnLog Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnMessage Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Ta5d6ff"Ta5d6ffMQTTMessageTa5d6ff"Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnPreConnect Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnPublish_v1 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnPublish_v2 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3ReasonCodeTb4b4b4, Te6edf3PropertiesTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnPublish Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnPublish_v1Tb4b4b4, Te6edf3CallbackOnPublish_v2Tb4b4b4]
Te6edf3CallbackOnSocket Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Ta5d6ff"Ta5d6ffSocketLikeTa5d6ff"Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnSubscribe_v1_mqtt3 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3TupleTb4b4b4[Tffa657intTb4b4b4, Tff7b72.Tff7b72.Tff7b72.Tb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnSubscribe_v1_mqtt5 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3ListTb4b4b4[Te6edf3ReasonCodeTb4b4b4]Tb4b4b4, Te6edf3PropertiesTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnSubscribe_v1 Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnSubscribe_v1_mqtt3Tb4b4b4, Te6edf3CallbackOnSubscribe_v1_mqtt5Tb4b4b4]
Te6edf3CallbackOnSubscribe_v2 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3ListTb4b4b4[Te6edf3ReasonCodeTb4b4b4]Tb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnSubscribe Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnSubscribe_v1Tb4b4b4, Te6edf3CallbackOnSubscribe_v2Tb4b4b4]
Te6edf3CallbackOnUnsubscribe_v1_mqtt3 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnUnsubscribe_v1_mqtt5 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3PropertiesTb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3ReasonCodeTb4b4b4, Te6edf3ListTb4b4b4[Te6edf3ReasonCodeTb4b4b4]Tb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnUnsubscribe_v1 Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnUnsubscribe_v1_mqtt3Tb4b4b4, Te6edf3CallbackOnUnsubscribe_v1_mqtt5Tb4b4b4]
Te6edf3CallbackOnUnsubscribe_v2 Tff7b72= Te6edf3CallableTb4b4b4[Tb4b4b4[Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4, Te6edf3AnyTb4b4b4, Tffa657intTb4b4b4, Te6edf3ListTb4b4b4[Te6edf3ReasonCodeTb4b4b4]Tb4b4b4, Te6edf3UnionTb4b4b4[Te6edf3PropertiesTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4]
Te6edf3CallbackOnUnsubscribe Tff7b72= Te6edf3UnionTb4b4b4[Te6edf3CallbackOnUnsubscribe_v1Tb4b4b4, Te6edf3CallbackOnUnsubscribe_v2Tb4b4b4]
T8b949e# This is needed for typing because class Client redefined the name "socket"
Te6edf3_socket Tff7b72= Te6edf3socket
Tff7b72class T56d364WebsocketConnectionErrorTb4b4b4(Tf85149ConnectionErrorTb4b4b4)Tb4b4b4:
T8b949e""" WebsocketConnectionError is a subclass of ConnectionError.
It's raised when unable to perform the Websocket handshake.
"""
Tff7b72pass
Tff7b72def Td2a8fferror_stringTb4b4b4(Te6edf3mqtt_errnoTb4b4b4: Te6edf3MQTTErrorCode Tff7b72| Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Return the error string associated with an mqtt error number."""
Tff7b72if Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffNo error.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_NOMEMTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffOut of memory.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_PROTOCOLTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffA network protocol error occurred when communicating with the broker.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_INVALTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffInvalid function arguments provided.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_NO_CONNTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffThe client is not currently connected.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_CONN_REFUSEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffThe connection was refused.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_NOT_FOUNDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffMessage not found (internal error).Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_CONN_LOSTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffThe connection was lost.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_TLSTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffA TLS error occurred.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_PAYLOAD_SIZETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPayload too large.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_NOT_SUPPORTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffThis feature is not supported.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_AUTHTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffAuthorisation failed.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_ACL_DENIEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffAccess denied by ACL.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_UNKNOWNTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknown error.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_ERRNOTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffError defined by errno.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_QUEUE_SIZETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffMessage queue full.Ta5d6ff"
Tff7b72elif Te6edf3mqtt_errno Tff7b72== Te6edf3MQTT_ERR_KEEPALIVETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffClient or broker did not communicate in the keepalive interval.Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknown error.Ta5d6ff"
Tff7b72def Td2a8ffconnack_stringTb4b4b4(Te6edf3connack_codeTb4b4b4: Tffa657intTff7b72|Te6edf3ReasonCodeTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Return the string associated with a CONNACK result or CONNACK reason code."""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3connack_codeTb4b4b4, Te6edf3ReasonCodeTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3connack_codeTb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3CONNACK_ACCEPTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Accepted.Ta5d6ff"
Tff7b72elif Te6edf3connack_code Tff7b72== Te6edf3CONNACK_REFUSED_PROTOCOL_VERSIONTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: unacceptable protocol version.Ta5d6ff"
Tff7b72elif Te6edf3connack_code Tff7b72== Te6edf3CONNACK_REFUSED_IDENTIFIER_REJECTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: identifier rejected.Ta5d6ff"
Tff7b72elif Te6edf3connack_code Tff7b72== Te6edf3CONNACK_REFUSED_SERVER_UNAVAILABLETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: broker unavailable.Ta5d6ff"
Tff7b72elif Te6edf3connack_code Tff7b72== Te6edf3CONNACK_REFUSED_BAD_USERNAME_PASSWORDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: bad user name or password.Ta5d6ff"
Tff7b72elif Te6edf3connack_code Tff7b72== Te6edf3CONNACK_REFUSED_NOT_AUTHORIZEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: not authorised.Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffConnection Refused: unknown reason.Ta5d6ff"
Tff7b72def Td2a8ffconvert_connack_rc_to_reason_codeTb4b4b4(Te6edf3connack_codeTb4b4b4: Te6edf3ConnackCodeTb4b4b4) Tff7b72-Tff7b72> Te6edf3ReasonCodeTb4b4b4:
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_ACCEPTEDTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffSuccessTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_PROTOCOL_VERSIONTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffUnsupported protocol versionTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_IDENTIFIER_REJECTEDTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffClient identifier not validTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_SERVER_UNAVAILABLETb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffServer unavailableTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_BAD_USERNAME_PASSWORDTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffBad user name or passwordTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3connack_code Tff7b72== Te6edf3ConnackCodeTff7b72.Td2a8ffCONNACK_REFUSED_NOT_AUTHORIZEDTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffNot authorizedTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4, Ta5d6ff"Ta5d6ffUnspecified errorTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffconvert_disconnect_error_code_to_reason_codeTb4b4b4(Te6edf3rcTb4b4b4: Te6edf3MQTTErrorCodeTb4b4b4) Tff7b72-Tff7b72> Te6edf3ReasonCodeTb4b4b4:
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Ta5d6ff"Ta5d6ffSuccessTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_KEEPALIVETb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Ta5d6ff"Ta5d6ffKeep alive timeoutTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOSTTb4b4b4:
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Ta5d6ff"Ta5d6ffUnspecified errorTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4, Ta5d6ff"Ta5d6ffUnspecified errorTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_base62Tb4b4b4(
Te6edf3numTb4b4b4: Tffa657intTb4b4b4,
Te6edf3baseTb4b4b4: Tffa657str Tff7b72= Te6edf3stringTff7b72.Td2a8ffdigits Tff7b72+ Te6edf3stringTff7b72.Td2a8ffascii_lettersTb4b4b4,
Te6edf3paddingTb4b4b4: Tffa657int Tff7b72= T79c0ff1Tb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Convert a number to base-62 representation."""
Tff7b72if Te6edf3num Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNumber must be positive or zeroTa5d6ff"Tb4b4b4)
Te6edf3digits Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Te6edf3numTb4b4b4:
Te6edf3numTb4b4b4, Te6edf3rest Tff7b72= Tffa657divmodTb4b4b4(Te6edf3numTb4b4b4, T79c0ff62Tb4b4b4)
Te6edf3digitsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3baseTb4b4b4[Te6edf3restTb4b4b4]Tb4b4b4)
Te6edf3digitsTff7b72.Td2a8ffextendTb4b4b4(Te6edf3baseTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3digitsTb4b4b4)Tb4b4b4, Te6edf3paddingTb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tffa657reversedTb4b4b4(Te6edf3digitsTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftopic_matches_subTb4b4b4(Te6edf3subTb4b4b4: Tffa657strTb4b4b4, Te6edf3topicTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check whether a topic matches a subscription.
For example:
* Topic "foo/bar" would match the subscription "foo/#" or "+/bar"
* Topic "non/matching" would not match the subscription "non/+/+"
"""
Te6edf3matcher Tff7b72= Te6edf3MQTTMatcherTb4b4b4(Tb4b4b4)
Te6edf3matcherTb4b4b4[Te6edf3subTb4b4b4] Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tffa657nextTb4b4b4(Te6edf3matcherTff7b72.Td2a8ffiter_matchTb4b4b4(Te6edf3topicTb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149StopIterationTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_socketpair_compatTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4, Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4]Tb4b4b4:
T8b949e"""TCP/IP socketpair including Windows support"""
Te6edf3listensock Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(
Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPTb4b4b4)
Te6edf3listensockTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3listensockTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3listensockTff7b72.Td2a8fflistenTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3ifaceTb4b4b4, Te6edf3port Tff7b72= Te6edf3listensockTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)
Te6edf3sock1 Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(
Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPTb4b4b4)
Te6edf3sock1Tff7b72.Td2a8ffsetblockingTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3sock1Tff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, Te6edf3portTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72pass
Te6edf3sock2Tb4b4b4, Te6edf3address Tff7b72= Te6edf3listensockTff7b72.Td2a8ffacceptTb4b4b4(Tb4b4b4)
Te6edf3sock2Tff7b72.Td2a8ffsetblockingTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3listensockTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4(Te6edf3sock1Tb4b4b4, Te6edf3sock2Tb4b4b4)
Tff7b72def Td2a8ff_force_bytesTb4b4b4(Te6edf3sTb4b4b4: Tffa657str Tff7b72| Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3sTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3s
Tff7b72def Td2a8ff_encode_payloadTb4b4b4(Te6edf3payloadTb4b4b4: Tffa657str Tff7b72| Tffa657bytes Tff7b72| Tffa657bytearray Tff7b72| Tffa657int Tff7b72| Tffa657float Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTff7b72|Tffa657bytearrayTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3payloadTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tb4b4b4(Tffa657intTb4b4b4, Tffa657floatTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3payloadTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3payload Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(
Ta5d6ff"Ta5d6ffpayload must be a string, bytearray, int, float or None.Ta5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3payload
Tff7b72class T56d364MQTTMessageInfoTb4b4b4:
Tff7b72__slots__ Tff7b72= Ta5d6ff'Ta5d6ffmidTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff_publishedTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff_conditionTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffrcTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff_iterposTa5d6ff'
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmid Tff7b72= Te6edf3mid
T8b949e""" The message Id (int)"""
Tff7b72selfTff7b72.Td2a8ff_published Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_condition Tff7b72= Te6edf3threadingTff7b72.Td2a8ffConditionTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrcTb4b4b4: Te6edf3MQTTErrorCode Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
T8b949e""" The `MQTTErrorCode` that give status for this message.
This value could change until the message `is_published`"""
Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72= T79c0ff0
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffrcTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmidTb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__iter__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3IteratorTb4b4b4[Te6edf3MQTTErrorCode Tff7b72| Tffa657intTb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72= T79c0ff0
Tff7b72return Tff7b72self
Tff7b72def Tff7b72__next__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCode Tff7b72| Tffa657intTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffnextTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffnextTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCode Tff7b72| Tffa657intTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72= T79c0ff1
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrc
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_iterpos Tff7b72= T79c0ff2
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmid
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149StopIteration
Tff7b72def Tff7b72__getitem__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3indexTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCode Tff7b72| Tffa657intTb4b4b4:
Tff7b72if Te6edf3index Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrc
Tff7b72elif Te6edf3index Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmid
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149IndexErrorTb4b4b4(Ta5d6ff"Ta5d6ffindex out of rangeTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_set_as_publishedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_conditionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_published Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_conditionTff7b72.Td2a8ffnotifyTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffwait_for_publishTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrc Tff7b72== Te6edf3MQTT_ERR_QUEUE_SIZETb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffMessage is not queued due to ERR_QUEUE_SIZETa5d6ff'Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrc Tff7b72== Te6edf3MQTT_ERR_AGAINTb4b4b4:
Tff7b72pass
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrc Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff'Ta5d6ffMessage publish failed: Tffd700{Te6edf3error_stringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrcTb4b4b4)Tffd700}Ta5d6ff'Tb4b4b4)
Te6edf3timeout_time Tff7b72= Tff7b72None Tff7b72if Te6edf3timeout Tff7b72is Tff7b72None Tff7b72else Te6edf3time_funcTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Te6edf3timeout_tenth Tff7b72= Tff7b72None Tff7b72if Te6edf3timeout Tff7b72is Tff7b72None Tff7b72else Te6edf3timeout Tff7b72/ T79c0ff10.
Tff7b72def Td2a8fftimed_outTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tff7b72False Tff7b72if Te6edf3timeout_time Tff7b72is Tff7b72None Tff7b72else Te6edf3time_funcTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeout_time
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_conditionTb4b4b4:
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ff_published Tff7b72and Tff7b72not Te6edf3timed_outTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_conditionTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeout_tenthTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrc Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff'Ta5d6ffMessage publish failed: Tffd700{Te6edf3error_stringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrcTb4b4b4)Tffd700}Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffis_publishedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Returns True if the message associated with this object has been
published, else returns False.
To wait for this to become true, look at `wait_for_publish`.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_QUEUE_SIZETb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffMessage is not queued due to ERR_QUEUE_SIZETa5d6ff'Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAINTb4b4b4:
Tff7b72pass
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrc Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff'Ta5d6ffMessage publish failed: Tffd700{Te6edf3error_stringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrcTb4b4b4)Tffd700}Ta5d6ff'Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_conditionTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_published
Tff7b72class T56d364MQTTMessageTb4b4b4:
Tff7b72__slots__ Tff7b72= Ta5d6ff'Ta5d6fftimestampTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffstateTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffdupTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffmidTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff_topicTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffpayloadTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffqosTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffretainTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffinfoTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffpropertiesTa5d6ff'
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4, Te6edf3topicTb4b4b4: Tffa657bytes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_invalid
Tff7b72selfTff7b72.Td2a8ffdup Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmid Tff7b72= Te6edf3mid
T8b949e""" The message id (int)."""
Tff7b72selfTff7b72.Td2a8ff_topic Tff7b72= Te6edf3topic
Tff7b72selfTff7b72.Td2a8ffpayload Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
T8b949e"""the message payload (bytes)"""
Tff7b72selfTff7b72.Td2a8ffqos Tff7b72= T79c0ff0
T8b949e""" The message Quality of Service (0, 1 or 2)."""
Tff7b72selfTff7b72.Td2a8ffretain Tff7b72= Tff7b72False
T8b949e""" If true, the message is a retained message and not fresh."""
Tff7b72selfTff7b72.Td2a8ffinfo Tff7b72= Te6edf3MQTTMessageInfoTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72None
T8b949e""" In MQTT v5.0, the properties associated with the message. (`Properties`)"""
Tff7b72def Tff7b72__eq__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4: Tffa657objectTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Override the default Equals behavior"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3otherTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__class__Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmid Tff7b72== Te6edf3otherTff7b72.Td2a8ffmid
Tff7b72return Tff7b72False
Tff7b72def Tff7b72__ne__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4: Tffa657objectTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Define a non-equality test"""
Tff7b72return Tff7b72not Tff7b72selfTff7b72.Td2a8ff__eq__Tb4b4b4(Te6edf3otherTb4b4b4)
Tf0883e@property
Tff7b72def Td2a8fftopicTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""topic that the message was published on.
This property is read-only.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_topicTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tf0883e@topicTff7b72.Td2a8ffsetter
Tff7b72def Td2a8fftopicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_topic Tff7b72= Te6edf3value
Tff7b72class T56d364ClientTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3callback_api_versionTb4b4b4: Te6edf3CallbackAPIVersion Tff7b72= Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4,
Te6edf3client_idTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3clean_sessionTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3userdataTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3protocolTb4b4b4: Te6edf3MQTTProtocolVersion Tff7b72= Te6edf3MQTTv311Tb4b4b4,
Te6edf3transportTb4b4b4: Te6edf3LiteralTb4b4b4[Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunixTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4,
Te6edf3reconnect_on_failureTb4b4b4: Tffa657bool Tff7b72= Tff7b72TrueTb4b4b4,
Te6edf3manual_ackTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3transport Tff7b72= Te6edf3transportTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) T8b949e# type: ignore
Tff7b72if Te6edf3transport Tff7b72== Ta5d6ff"Ta5d6ffunixTa5d6ff" Tff7b72and Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3socketTb4b4b4, Ta5d6ff"Ta5d6ffAF_UNIXTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ffunixTa5d6ff"Ta5d6ff transport not supportedTa5d6ff'Tb4b4b4)
Tff7b72elif Te6edf3transport Tff7b72not Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunixTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6fffTa5d6ff'Ta5d6fftransport must be Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Ta5d6ff, Ta5d6ff"Ta5d6fftcpTa5d6ff"Ta5d6ff or Ta5d6ff"Ta5d6ffunixTa5d6ff"Ta5d6ff, not Tffd700{Te6edf3transportTffd700}Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_manual_ack Tff7b72= Te6edf3manual_ack
Tff7b72selfTff7b72.Td2a8ff_transport Tff7b72= Te6edf3transport
Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72= Te6edf3protocol
Tff7b72selfTff7b72.Td2a8ff_userdata Tff7b72= Te6edf3userdata
Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4: Te6edf3SocketLike Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_sockpairRTb4b4b4: Te6edf3socketTff7b72.Td2a8ffsocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_sockpairWTb4b4b4: Te6edf3socketTff7b72.Td2a8ffsocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_keepalive Tff7b72= T79c0ff60
Tff7b72selfTff7b72.Td2a8ff_connect_timeout Tff7b72= T79c0ff5.0
Tff7b72selfTff7b72.Td2a8ff_client_mode Tff7b72= Te6edf3MQTT_CLIENT
Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72= Te6edf3callback_api_version
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Te6edf3warningsTff7b72.Td2a8ffwarnTb4b4b4(
Ta5d6ff"Ta5d6ffCallback API version 1 is deprecated, update to latest versionTa5d6ff"Tb4b4b4,
Te6edf3categoryTff7b72=Tf85149DeprecationWarningTb4b4b4,
Te6edf3stacklevelTff7b72=T79c0ff2Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_callback_api_versionTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
T8b949e# Help user to migrate, it probably provided a client id
T8b949e# as first arguments
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffUnsupported callback API version: version 2.0 added a callback_api_version, see docs/migrations.rst for detailsTa5d6ff"
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72not Tff7b72in Te6edf3CallbackAPIVersionTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_startTb4b4b4: Tffa657int Tff7b72= Te6edf3MQTT_CLEAN_START_FIRST_ONLY
Tff7b72if Te6edf3protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3clean_session Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffClean session is not used for MQTT 5.0Ta5d6ff'Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3clean_session Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3clean_session Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3clean_session Tff7b72and Tb4b4b4(Te6edf3client_id Tff7b72== Ta5d6ff"Ta5d6ff" Tff7b72or Te6edf3client_id Tff7b72is Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffA client id must be provided if clean session is False.Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_session Tff7b72= Te6edf3clean_session
T8b949e# [MQTT-3.1.3-4] Client Id must be UTF-8 encoded string.
Tff7b72if Te6edf3client_id Tff7b72== Ta5d6ff"Ta5d6ff" Tff7b72or Te6edf3client_id Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3protocol Tff7b72== Te6edf3MQTTv31Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_client_id Tff7b72= Te6edf3_base62Tb4b4b4(Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffintTb4b4b4, Te6edf3paddingTff7b72=T79c0ff22Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf8Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_client_id Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_client_id Tff7b72= Te6edf3_force_bytesTb4b4b4(Te6edf3client_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_usernameTb4b4b4: Tffa657bytes Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_passwordTb4b4b4: Tffa657bytes Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4: Te6edf3_InPacket Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcommandTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffhave_remainingTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_countTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_multTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_lengthTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4: Tffa657bytearrayTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffto_processTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffposTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_out_packetTb4b4b4: Te6edf3collectionsTff7b72.Td2a8ffdequeTb4b4b4[Te6edf3_OutPacketTb4b4b4] Tff7b72= Te6edf3collectionsTff7b72.Td2a8ffdequeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_msg_in Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_msg_out Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_min_delay Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_reconnect_max_delay Tff7b72= T79c0ff120
Tff7b72selfTff7b72.Td2a8ff_reconnect_delayTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_reconnect_on_failure Tff7b72= Te6edf3reconnect_on_failure
Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ff_last_mid Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_NEW
Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4: Te6edf3collectionsTff7b72.Td2a8ffOrderedDictTb4b4b4[
Tffa657intTb4b4b4, Te6edf3MQTTMessage
Tb4b4b4] Tff7b72= Te6edf3collectionsTff7b72.Td2a8ffOrderedDictTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_in_messagesTb4b4b4: Te6edf3collectionsTff7b72.Td2a8ffOrderedDictTb4b4b4[
Tffa657intTb4b4b4, Te6edf3MQTTMessage
Tb4b4b4] Tff7b72= Te6edf3collectionsTff7b72.Td2a8ffOrderedDictTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72= T79c0ff20
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_max_queued_messages Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_connect_propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_will_propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_will Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_will_topic Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_will_payload Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_will_qos Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_will_retain Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_on_message_filtered Tff7b72= Te6edf3MQTTMatcherTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_host Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_port Tff7b72= T79c0ff1883
Tff7b72selfTff7b72.Td2a8ff_bind_address Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_bind_port Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_proxyTb4b4b4: Te6edf3Any Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_in_callback_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_callback_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_msgtime_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_out_message_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_in_message_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_mid_generate_mutex Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_threadTb4b4b4: Te6edf3threadingTff7b72.Td2a8ffThread Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_ssl Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_ssl_contextTb4b4b4: Te6edf3sslTff7b72.Td2a8ffSSLContext Tff7b72| Tff7b72None Tff7b72= Tff7b72None
T8b949e# Only used when SSL context does not have check_hostname attribute
Tff7b72selfTff7b72.Td2a8ff_tls_insecure Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_loggerTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffLogger Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_registered_write Tff7b72= Tff7b72False
T8b949e# No default callbacks
Tff7b72selfTff7b72.Td2a8ff_on_logTb4b4b4: Te6edf3CallbackOnLog Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_pre_connectTb4b4b4: Te6edf3CallbackOnPreConnect Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_connectTb4b4b4: Te6edf3CallbackOnConnect Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_connect_failTb4b4b4: Te6edf3CallbackOnConnectFail Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_subscribeTb4b4b4: Te6edf3CallbackOnSubscribe Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_messageTb4b4b4: Te6edf3CallbackOnMessage Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_publishTb4b4b4: Te6edf3CallbackOnPublish Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_unsubscribeTb4b4b4: Te6edf3CallbackOnUnsubscribe Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_disconnectTb4b4b4: Te6edf3CallbackOnDisconnect Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_socket_openTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_socket_closeTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_socket_register_writeTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_on_socket_unregister_writeTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_websocket_path Tff7b72= Ta5d6ff"Ta5d6ff/mqttTa5d6ff"
Tff7b72selfTff7b72.Td2a8ff_websocket_extra_headersTb4b4b4: Te6edf3WebSocketHeaders Tff7b72| Tff7b72None Tff7b72= Tff7b72None
T8b949e# for clean_start == MQTT_CLEAN_START_FIRST_ONLY
Tff7b72selfTff7b72.Td2a8ff_mqttv5_first_connect Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffsuppress_exceptions Tff7b72= Tff7b72False T8b949e# For callbacks
Tff7b72def Tff7b72__del__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reset_socketsTb4b4b4(Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffhostTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""
Host to connect to. If `connect()` hasn't been called yet, returns an empty string.
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_host
Tf0883e@hostTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffhostTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating host on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3valueTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid host.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_host Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffportTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e"""
Broker TCP port to connect to.
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_port
Tf0883e@portTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffportTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating port on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid port number.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_port Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffkeepaliveTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e"""
Client keepalive interval (in seconds).
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_keepalive
Tf0883e@keepaliveTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffkeepaliveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# The issue here is that the previous value of keepalive matter to possibly
T8b949e# sent ping packet.
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating keepalive on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffKeepalive must be >=0.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_keepalive Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8fftransportTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3LiteralTb4b4b4[Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunixTa5d6ff"Tb4b4b4]Tb4b4b4:
T8b949e"""
Transport method used for the connection ("tcp" or "websockets").
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_transport
Tf0883e@transportTff7b72.Td2a8ffsetter
Tff7b72def Td2a8fftransportTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3LiteralTb4b4b4[Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating transport on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_transport Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffprotocolTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTProtocolVersionTb4b4b4:
T8b949e"""
Protocol version used (MQTT v3, MQTT v3.11, MQTTv5)
This property is read-only.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_protocol
Tf0883e@property
Tff7b72def Td2a8ffconnect_timeoutTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657floatTb4b4b4:
T8b949e"""
Connection establishment timeout in seconds.
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_connect_timeout
Tf0883e@connect_timeoutTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffconnect_timeoutTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657floatTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating connect_timeout on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72<Tff7b72= T79c0ff0.0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6fftimeout must be a positive numberTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_connect_timeout Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffusernameTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The username used to connect to the MQTT broker, or None if no username is used.
This property may not be changed if the connection is already open.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_username Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_usernameTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tf0883e@usernameTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffusernameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating username on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_username Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_username Tff7b72= Te6edf3valueTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffpasswordTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The password used to connect to the MQTT broker, or None if no password is used.
This property may not be changed if the connection is already open.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_password Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_passwordTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tf0883e@passwordTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffpasswordTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating password on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_password Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_password Tff7b72= Te6edf3valueTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffmax_inflight_messagesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e"""
Maximum number of messages with QoS > 0 that can be partway through the network flow at once
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages
Tf0883e@max_inflight_messagesTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffmax_inflight_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Not tested. Some doubt that everything is okay when max_inflight change between 0
T8b949e# and > 0 value because _update_inflight is skipped when _max_inflight_messages == 0
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating max_inflight_messages on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid inflight.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffmax_queued_messagesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e"""
Maximum number of message in the outgoing message queue, 0 means unlimited
This property may not be changed if the connection is already open.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_max_queued_messages
Tf0883e@max_queued_messagesTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffmax_queued_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_connection_closedTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Not tested.
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffupdating max_queued_messages on established connection is not supportedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid queue size.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_max_queued_messages Tff7b72= Te6edf3value
Tf0883e@property
Tff7b72def Td2a8ffwill_topicTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""
The topic name a will message is sent to when disconnecting unexpectedly. None if a will shall not be sent.
This property is read-only. Use `will_set()` to change its value.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_will_topic Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_will_topicTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffwill_payloadTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657bytes Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""
The payload for the will message that is sent when disconnecting unexpectedly. None if a will shall not be sent.
This property is read-only. Use `will_set()` to change its value.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_will_payload
Tf0883e@property
Tff7b72def Td2a8ffloggerTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3loggingTff7b72.Td2a8ffLogger Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_logger
Tf0883e@loggerTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffloggerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffLogger Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logger Tff7b72= Te6edf3value
Tff7b72def Td2a8ff_sock_recvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufsizeTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffself._sock is NoneTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_sockTff7b72.Td2a8ffrecvTb4b4b4(Te6edf3bufsizeTb4b4b4)
Tff7b72except Te6edf3sslTff7b72.Td2a8ffSSLWantReadError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72raise Tf85149BlockingIOErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72except Te6edf3sslTff7b72.Td2a8ffSSLWantWriteError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_call_socket_register_writeTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149BlockingIOErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72except Tf85149AttributeError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffsocket was None: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72raise Tf85149ConnectionErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72def Td2a8ff_sock_sendTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffself._sock is NoneTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_sockTff7b72.Td2a8ffsendTb4b4b4(Te6edf3bufTb4b4b4)
Tff7b72except Te6edf3sslTff7b72.Td2a8ffSSLWantReadError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72raise Tf85149BlockingIOErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72except Te6edf3sslTff7b72.Td2a8ffSSLWantWriteError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_call_socket_register_writeTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149BlockingIOErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72except Tf85149BlockingIOError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_call_socket_register_writeTb4b4b4(Tb4b4b4)
Tff7b72raise Tf85149BlockingIOErrorTb4b4b4(Tb4b4b4) Tff7b72from T7ee787err
Tff7b72def Td2a8ff_sock_closeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Close the connection to the server."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sock
Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_call_socket_unregister_writeTb4b4b4(Te6edf3sockTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_call_socket_closeTb4b4b4(Te6edf3sockTb4b4b4)
Tff7b72finallyTb4b4b4:
T8b949e# In case a callback fails, still close the socket to avoid leaking the file descriptor.
Te6edf3sockTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_reset_socketsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sockpair_onlyTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3sockpair_onlyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairRTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sockpairRTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sockpairR Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairWTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sockpairWTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sockpairW Tff7b72= Tff7b72None
Tff7b72def Td2a8ffreinitialiseTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3client_idTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3clean_sessionTb4b4b4: Tffa657bool Tff7b72= Tff7b72TrueTb4b4b4,
Te6edf3userdataTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reset_socketsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3client_idTb4b4b4, Te6edf3clean_sessionTb4b4b4, Te6edf3userdataTb4b4b4) T8b949e# type: ignore[misc]
Tff7b72def Td2a8ffws_set_optionsTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3pathTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff/mqttTa5d6ff"Tb4b4b4,
Te6edf3headersTb4b4b4: Te6edf3WebSocketHeaders Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e""" Set the path and headers for a websocket connection
:param str path: a string starting with / which should be the endpoint of the
mqtt connection on the remote server
:param headers: can be either a dict or a callable object. If it is a dict then
the extra items in the dict are added to the websocket headers. If it is
a callable, then the default websocket headers are passed into this
function and the result is used as the new headers.
"""
Tff7b72selfTff7b72.Td2a8ff_websocket_path Tff7b72= Te6edf3path
Tff7b72if Te6edf3headers Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3headersTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tffa657callableTb4b4b4(Te6edf3headersTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_websocket_extra_headers Tff7b72= Te6edf3headers
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ff'Ta5d6ffheadersTa5d6ff'Ta5d6ff option to ws_set_options has to be either a dictionary or callableTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftls_set_contextTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3contextTb4b4b4: Te6edf3sslTff7b72.Td2a8ffSSLContext Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Configure network encryption and authentication context. Enables SSL/TLS support.
:param context: an ssl.SSLContext object. By default this is given by
``ssl.create_default_context()``, if available.
Must be called before `connect()`, `connect_async()` or `connect_srv()`."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_ssl_context Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffSSL/TLS has already been configured.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3context Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3context Tff7b72= Te6edf3sslTff7b72.Td2a8ffcreate_default_contextTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ssl Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_ssl_context Tff7b72= Te6edf3context
T8b949e# Ensure _tls_insecure is consistent with check_hostname attribute
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3contextTb4b4b4, Ta5d6ff'Ta5d6ffcheck_hostnameTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_tls_insecure Tff7b72= Tff7b72not Te6edf3contextTff7b72.Td2a8ffcheck_hostname
Tff7b72def Td2a8fftls_setTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3ca_certsTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3certfileTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3keyfileTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3cert_reqsTb4b4b4: Te6edf3sslTff7b72.Td2a8ffVerifyMode Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3tls_versionTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3ciphersTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3keyfile_passwordTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3alpn_protocolsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Configure network encryption and authentication options. Enables SSL/TLS support.
:param str ca_certs: a string path to the Certificate Authority certificate files
that are to be treated as trusted by this client. If this is the only
option given then the client will operate in a similar manner to a web
browser. That is to say it will require the broker to have a
certificate signed by the Certificate Authorities in ca_certs and will
communicate using TLS v1,2, but will not attempt any form of
authentication. This provides basic network encryption but may not be
sufficient depending on how the broker is configured.
By default, on Python 2.7.9+ or 3.4+, the default certification
authority of the system is used. On older Python version this parameter
is mandatory.
:param str certfile: PEM encoded client certificate filename. Used with
keyfile for client TLS based authentication. Support for this feature is
broker dependent. Note that if the files in encrypted and needs a password to
decrypt it, then this can be passed using the keyfile_password argument - you
should take precautions to ensure that your password is
not hard coded into your program by loading the password from a file
for example. If you do not provide keyfile_password, the password will
be requested to be typed in at a terminal window.
:param str keyfile: PEM encoded client private keys filename. Used with
certfile for client TLS based authentication. Support for this feature is
broker dependent. Note that if the files in encrypted and needs a password to
decrypt it, then this can be passed using the keyfile_password argument - you
should take precautions to ensure that your password is
not hard coded into your program by loading the password from a file
for example. If you do not provide keyfile_password, the password will
be requested to be typed in at a terminal window.
:param cert_reqs: the certificate requirements that the client imposes
on the broker to be changed. By default this is ssl.CERT_REQUIRED,
which means that the broker must provide a certificate. See the ssl
pydoc for more information on this parameter.
:param tls_version: the version of the SSL/TLS protocol used to be
specified. By default TLS v1.2 is used. Previous versions are allowed
but not recommended due to possible security problems.
:param str ciphers: encryption ciphers that are allowed
for this connection, or None to use the defaults. See the ssl pydoc for
more information.
Must be called before `connect()`, `connect_async()` or `connect_srv()`."""
Tff7b72if Te6edf3ssl Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffThis platform has no SSL/TLS.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3sslTb4b4b4, Ta5d6ff'Ta5d6ffSSLContextTa5d6ff'Tb4b4b4)Tb4b4b4:
T8b949e# Require Python version that has SSL context support in standard library
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffPython 2.7.9 and 3.2 are the minimum supported versions for TLS.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3ca_certs Tff7b72is Tff7b72None Tff7b72and Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3sslTff7b72.Td2a8ffSSLContextTb4b4b4, Ta5d6ff'Ta5d6ffload_default_certsTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffca_certs must not be None.Ta5d6ff'Tb4b4b4)
T8b949e# Create SSLContext object
Tff7b72if Te6edf3tls_version Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3tls_version Tff7b72= Te6edf3sslTff7b72.Td2a8ffPROTOCOL_TLSv1_2
T8b949e# If the python version supports it, use highest TLS version automatically
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3sslTb4b4b4, Ta5d6ff"Ta5d6ffPROTOCOL_TLS_CLIENTTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# This also enables CERT_REQUIRED and check_hostname by default.
Te6edf3tls_version Tff7b72= Te6edf3sslTff7b72.Td2a8ffPROTOCOL_TLS_CLIENT
Tff7b72elif Tffa657hasattrTb4b4b4(Te6edf3sslTb4b4b4, Ta5d6ff"Ta5d6ffPROTOCOL_TLSTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3tls_version Tff7b72= Te6edf3sslTff7b72.Td2a8ffPROTOCOL_TLS
Te6edf3context Tff7b72= Te6edf3sslTff7b72.Td2a8ffSSLContextTb4b4b4(Te6edf3tls_versionTb4b4b4)
T8b949e# Configure context
Tff7b72if Te6edf3ciphers Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3contextTff7b72.Td2a8ffset_ciphersTb4b4b4(Te6edf3ciphersTb4b4b4)
Tff7b72if Te6edf3certfile Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3contextTff7b72.Td2a8ffload_cert_chainTb4b4b4(Te6edf3certfileTb4b4b4, Te6edf3keyfileTb4b4b4, Te6edf3keyfile_passwordTb4b4b4)
Tff7b72if Te6edf3cert_reqs Tff7b72== Te6edf3sslTff7b72.Td2a8ffCERT_NONE Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3contextTb4b4b4, Ta5d6ff'Ta5d6ffcheck_hostnameTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3contextTff7b72.Td2a8ffcheck_hostname Tff7b72= Tff7b72False
Te6edf3contextTff7b72.Td2a8ffverify_mode Tff7b72= Te6edf3sslTff7b72.Td2a8ffCERT_REQUIRED Tff7b72if Te6edf3cert_reqs Tff7b72is Tff7b72None Tff7b72else Te6edf3cert_reqs
Tff7b72if Te6edf3ca_certs Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3contextTff7b72.Td2a8ffload_verify_locationsTb4b4b4(Te6edf3ca_certsTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3contextTff7b72.Td2a8ffload_default_certsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3alpn_protocols Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Te6edf3sslTb4b4b4, Ta5d6ff"Ta5d6ffHAS_ALPNTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffSSL library has no support for ALPNTa5d6ff"Tb4b4b4)
Te6edf3contextTff7b72.Td2a8ffset_alpn_protocolsTb4b4b4(Te6edf3alpn_protocolsTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftls_set_contextTb4b4b4(Te6edf3contextTb4b4b4)
Tff7b72if Te6edf3cert_reqs Tff7b72!= Te6edf3sslTff7b72.Td2a8ffCERT_NONETb4b4b4:
T8b949e# Default to secure, sets context.check_hostname attribute
T8b949e# if available
Tff7b72selfTff7b72.Td2a8fftls_insecure_setTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# But with ssl.CERT_NONE, we can not check_hostname
Tff7b72selfTff7b72.Td2a8fftls_insecure_setTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8fftls_insecure_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3valueTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Configure verification of the server hostname in the server certificate.
If value is set to true, it is impossible to guarantee that the host
you are connecting to is not impersonating your server. This can be
useful in initial server testing, but makes it possible for a malicious
third party to impersonate your server through DNS spoofing, for
example.
Do not use this function in a real system. Setting value to true means
there is no point using encryption.
Must be called before `connect()` and after either `tls_set()` or
`tls_set_context()`."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_ssl_context Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffMust configure SSL context before using tls_insecure_set.Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_tls_insecure Tff7b72= Te6edf3value
T8b949e# Ensure check_hostname is consistent with _tls_insecure attribute
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_ssl_contextTb4b4b4, Ta5d6ff'Ta5d6ffcheck_hostnameTa5d6ff'Tb4b4b4)Tb4b4b4:
T8b949e# Rely on SSLContext to check host name
T8b949e# If verify_mode is CERT_NONE then the host name will never be checked
Tff7b72selfTff7b72.Td2a8ff_ssl_contextTff7b72.Td2a8ffcheck_hostname Tff7b72= Tff7b72not Te6edf3value
Tff7b72def Td2a8ffproxy_setTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3proxy_argsTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Configure proxying of MQTT connection. Enables support for SOCKS or
HTTP proxies.
Proxying is done through the PySocks library. Brief descriptions of the
proxy_args parameters are below; see the PySocks docs for more info.
(Required)
:param proxy_type: One of {socks.HTTP, socks.SOCKS4, or socks.SOCKS5}
:param proxy_addr: IP address or DNS name of proxy server
(Optional)
:param proxy_port: (int) port number of the proxy server. If not provided,
the PySocks package default value will be utilized, which differs by proxy_type.
:param proxy_rdns: boolean indicating whether proxy lookup should be performed
remotely (True, default) or locally (False)
:param proxy_username: username for SOCKS5 proxy, or userid for SOCKS4 proxy
:param proxy_password: password for SOCKS5 proxy
Example::
mqttc.proxy_set(proxy_type=socks.HTTP, proxy_addr='1.2.3.4', proxy_port=4231)
"""
Tff7b72if Te6edf3socks Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffPySocks must be installed for proxy support.Ta5d6ff"Tb4b4b4)
Tff7b72elif Tff7b72not Tff7b72selfTff7b72.Td2a8ff_proxy_is_validTb4b4b4(Te6edf3proxy_argsTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffproxy_type and/or proxy_addr are invalid.Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_proxy Tff7b72= Te6edf3proxy_args
Tff7b72def Td2a8ffenable_loggerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3loggerTb4b4b4: Te6edf3loggingTff7b72.Td2a8ffLogger Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
Enables a logger to send log messages to
:param logging.Logger logger: if specified, that ``logging.Logger`` object will be used, otherwise
one will be created automatically.
See `disable_logger` to undo this action.
"""
Tff7b72if Te6edf3logger Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_logger Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
T8b949e# Do not replace existing logger
Tff7b72return
Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3logger
Tff7b72def Td2a8ffdisable_loggerTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
Disable logging using standard python logging package. This has no effect on the `on_log` callback.
"""
Tff7b72selfTff7b72.Td2a8ff_logger Tff7b72= Tff7b72None
Tff7b72def Td2a8ffconnectTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3hostTb4b4b4: Tffa657strTb4b4b4,
Te6edf3portTb4b4b4: Tffa657int Tff7b72= T79c0ff1883Tb4b4b4,
Te6edf3keepaliveTb4b4b4: Tffa657int Tff7b72= T79c0ff60Tb4b4b4,
Te6edf3bind_addressTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3bind_portTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3clean_startTb4b4b4: Te6edf3CleanStartOption Tff7b72= Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Connect to a remote broker. This is a blocking call that establishes
the underlying connection and transmits a CONNECT packet.
Note that the connection status will not be updated until a CONNACK is received and
processed (this requires a running network loop, see `loop_start`, `loop_forever`, `loop`...).
:param str host: the hostname or IP address of the remote broker.
:param int port: the network port of the server host to connect to. Defaults to
1883. Note that the default port for MQTT over SSL/TLS is 8883 so if you
are using `tls_set()` the port may need providing.
:param int keepalive: Maximum period in seconds between communications with the
broker. If no other messages are being exchanged, this controls the
rate at which the client will send ping messages to the broker.
:param bool clean_start: (MQTT v5.0 only) True, False or MQTT_CLEAN_START_FIRST_ONLY.
Sets the MQTT v5.0 clean_start flag always, never or on the first successful connect only,
respectively. MQTT session data (such as outstanding messages and subscriptions)
is cleared on successful connect when the clean_start flag is set.
For MQTT v3.1.1, the ``clean_session`` argument of `Client` should be used for similar
result.
:param Properties properties: (MQTT v5.0 only) the MQTT v5.0 properties to be sent in the
MQTT connect packet.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_mqttv5_first_connect Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3clean_start Tff7b72!= Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffClean start only applies to MQTT V5Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3propertiesTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffProperties only apply to MQTT V5Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconnect_asyncTb4b4b4(Te6edf3hostTb4b4b4, Te6edf3portTb4b4b4, Te6edf3keepaliveTb4b4b4,
Te6edf3bind_addressTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3clean_startTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffconnect_srvTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3domainTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3keepaliveTb4b4b4: Tffa657int Tff7b72= T79c0ff60Tb4b4b4,
Te6edf3bind_addressTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3bind_portTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3clean_startTb4b4b4: Te6edf3CleanStartOption Tff7b72= Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Connect to a remote broker.
:param str domain: the DNS domain to search for SRV records; if None,
try to determine local domain name.
:param keepalive, bind_address, clean_start and properties: see `connect()`
"""
Tff7b72if Te6edf3HAVE_DNS Tff7b72is Tff7b72FalseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffNo DNS resolver library found, try Ta5d6ff"Ta5d6ffpip install dnspythonTa5d6ff"Ta5d6ff.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3domain Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3domain Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetfqdnTb4b4b4(Tb4b4b4)
Te6edf3domain Tff7b72= Te6edf3domainTb4b4b4[Te6edf3domainTff7b72.Td2a8fffindTb4b4b4(Ta5d6ff'Ta5d6ff.Ta5d6ff'Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3rr Tff7b72= Ta5d6fffTa5d6ff'Ta5d6ff_mqtt._tcp.Tffd700{Te6edf3domainTffd700}Ta5d6ff'
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sslTb4b4b4:
T8b949e# IANA specifies secure-mqtt (not mqtts) for port 8883
Te6edf3rr Tff7b72= Ta5d6fffTa5d6ff'Ta5d6ff_secure-mqtt._tcp.Tffd700{Te6edf3domainTffd700}Ta5d6ff'
Te6edf3answers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3answer Tff7b72in Te6edf3dnsTff7b72.Td2a8ffresolverTff7b72.Td2a8ffqueryTb4b4b4(Te6edf3rrTb4b4b4, Te6edf3dnsTff7b72.Td2a8ffrdatatypeTff7b72.Td2a8ffSRVTb4b4b4)Tb4b4b4:
Te6edf3addr Tff7b72= Te6edf3answerTff7b72.Td2a8fftargetTff7b72.Td2a8ffto_textTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Te6edf3answersTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(Te6edf3addrTb4b4b4, Te6edf3answerTff7b72.Td2a8ffportTb4b4b4, Te6edf3answerTff7b72.Td2a8ffpriorityTb4b4b4, Te6edf3answerTff7b72.Td2a8ffweightTb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Te6edf3dnsTff7b72.Td2a8ffresolverTff7b72.Td2a8ffNXDOMAINTb4b4b4, Te6edf3dnsTff7b72.Td2a8ffresolverTff7b72.Td2a8ffNoAnswerTb4b4b4, Te6edf3dnsTff7b72.Td2a8ffresolverTff7b72.Td2a8ffNoNameserversTb4b4b4) Tff7b72as Te6edf3errTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo answer/NXDOMAIN for SRV in Tffd700{Te6edf3domainTffd700}Ta5d6ff"Tb4b4b4) Tff7b72from T7ee787err
T8b949e# FIXME: doesn't account for weight
Tff7b72for Te6edf3answer Tff7b72in Te6edf3answersTb4b4b4:
Te6edf3hostTb4b4b4, Te6edf3portTb4b4b4, Te6edf3prioTb4b4b4, Te6edf3weight Tff7b72= Te6edf3answer
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Te6edf3hostTb4b4b4, Te6edf3portTb4b4b4, Te6edf3keepaliveTb4b4b4, Te6edf3bind_addressTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3clean_startTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
Tff7b72pass
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo SRV hosts respondedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffconnect_asyncTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3hostTb4b4b4: Tffa657strTb4b4b4,
Te6edf3portTb4b4b4: Tffa657int Tff7b72= T79c0ff1883Tb4b4b4,
Te6edf3keepaliveTb4b4b4: Tffa657int Tff7b72= T79c0ff60Tb4b4b4,
Te6edf3bind_addressTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3bind_portTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3clean_startTb4b4b4: Te6edf3CleanStartOption Tff7b72= Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Connect to a remote broker asynchronously. This is a non-blocking
connect call that can be used with `loop_start()` to provide very quick
start.
Any already established connection will be terminated immediately.
:param str host: the hostname or IP address of the remote broker.
:param int port: the network port of the server host to connect to. Defaults to
1883. Note that the default port for MQTT over SSL/TLS is 8883 so if you
are using `tls_set()` the port may need providing.
:param int keepalive: Maximum period in seconds between communications with the
broker. If no other messages are being exchanged, this controls the
rate at which the client will send ping messages to the broker.
:param bool clean_start: (MQTT v5.0 only) True, False or MQTT_CLEAN_START_FIRST_ONLY.
Sets the MQTT v5.0 clean_start flag always, never or on the first successful connect only,
respectively. MQTT session data (such as outstanding messages and subscriptions)
is cleared on successful connect when the clean_start flag is set.
For MQTT v3.1.1, the ``clean_session`` argument of `Client` should be used for similar
result.
:param Properties properties: (MQTT v5.0 only) the MQTT v5.0 properties to be sent in the
MQTT connect packet.
"""
Tff7b72if Te6edf3bind_port Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid bind port number.Ta5d6ff'Tb4b4b4)
T8b949e# Switch to state NEW to allow update of host, port & co.
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_NEW
Tff7b72selfTff7b72.Td2a8ffhost Tff7b72= Te6edf3host
Tff7b72selfTff7b72.Td2a8ffport Tff7b72= Te6edf3port
Tff7b72selfTff7b72.Td2a8ffkeepalive Tff7b72= Te6edf3keepalive
Tff7b72selfTff7b72.Td2a8ff_bind_address Tff7b72= Te6edf3bind_address
Tff7b72selfTff7b72.Td2a8ff_bind_port Tff7b72= Te6edf3bind_port
Tff7b72selfTff7b72.Td2a8ff_clean_start Tff7b72= Te6edf3clean_start
Tff7b72selfTff7b72.Td2a8ff_connect_properties Tff7b72= Te6edf3properties
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECT_ASYNC
Tff7b72def Td2a8ffreconnect_delay_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3min_delayTb4b4b4: Tffa657int Tff7b72= T79c0ff1Tb4b4b4, Te6edf3max_delayTb4b4b4: Tffa657int Tff7b72= T79c0ff120Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e""" Configure the exponential reconnect delay
When connection is lost, wait initially min_delay seconds and
double this time every attempt. The wait is capped at max_delay.
Once the client is fully connected (e.g. not only TCP socket, but
received a success CONNACK), the wait timer is reset to min_delay.
"""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_reconnect_delay_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_min_delay Tff7b72= Te6edf3min_delay
Tff7b72selfTff7b72.Td2a8ff_reconnect_max_delay Tff7b72= Te6edf3max_delay
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72= Tff7b72None
Tff7b72def Td2a8ffreconnectTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Reconnect the client after a disconnect. Can only be called after
connect()/connect_async()."""
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid host.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_port Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid port number.Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_in_packet Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcommandTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffhave_remainingTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_countTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_multTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_lengthTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4: Tffa657bytearrayTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffto_processTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffposTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTING
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
T8b949e# Mark all currently outgoing QoS = 0 packets as lost,
T8b949e# or `wait_for_publish()` could hang forever
Tff7b72for Te6edf3pkt Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_packetTb4b4b4:
Tff7b72if Te6edf3pktTb4b4b4[Ta5d6ff"Ta5d6ffcommandTa5d6ff"Tb4b4b4] Tff7b72& T79c0ff0xF0 Tff7b72== Te6edf3PUBLISH Tff7b72and Te6edf3pktTb4b4b4[Ta5d6ff"Ta5d6ffqosTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff0 Tff7b72and Te6edf3pktTb4b4b4[Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3pktTb4b4b4[Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffrc Tff7b72= Te6edf3MQTT_ERR_CONN_LOST
Te6edf3pktTb4b4b4[Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ff_set_as_publishedTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_in Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_msg_out Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
T8b949e# Put messages in progress in a valid state.
Tff7b72selfTff7b72.Td2a8ff_messages_reconnect_resetTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_pre_connect Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_pre_connect
Tff7b72if Te6edf3on_pre_connectTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_pre_connectTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_pre_connect: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_socketTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sockTff7b72.Td2a8ffsetblockingTb4b4b4(Tff7b72FalseTb4b4b4) T8b949e# type: ignore[attr-defined]
Tff7b72selfTff7b72.Td2a8ff_registered_write Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_call_socket_openTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_connectTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_keepaliveTb4b4b4)
Tff7b72def Td2a8ffloopTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff1.0Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Process network events.
It is strongly recommended that you use `loop_start()`, or
`loop_forever()`, or if you are using an external event loop using
`loop_read()`, `loop_write()`, and `loop_misc()`. Using loop() on it's own is
no longer recommended.
This function must be called regularly to ensure communication with the
broker is carried out. It calls select() on the network socket to wait
for network events. If incoming data is present it will then be
processed. Outgoing commands, from e.g. `publish()`, are normally sent
immediately that their function is called, but this is not always
possible. loop() will also attempt to send any remaining outgoing
messages, which also includes commands that are part of the flow for
messages with QoS>0.
:param int timeout: The time in seconds to wait for incoming/outgoing network
traffic before timing out and returning.
Returns MQTT_ERR_SUCCESS on success.
Returns >0 on error.
A ValueError will be raised if timeout < 0"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairR Tff7b72is Tff7b72None Tff7b72or Tff7b72selfTff7b72.Td2a8ff_sockpairW Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reset_socketsTb4b4b4(Te6edf3sockpair_onlyTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sockpairRTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_sockpairW Tff7b72= Te6edf3_socketpair_compatTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_loopTb4b4b4(Te6edf3timeoutTb4b4b4)
Tff7b72def Td2a8ff_loopTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff1.0Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Te6edf3timeout Tff7b72< T79c0ff0.0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid timeout.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwant_writeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3wlist Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3wlist Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# used to check if there are any bytes left in the (SSL) socket
Te6edf3pending_bytes Tff7b72= T79c0ff0
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4, Ta5d6ff'Ta5d6ffpendingTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3pending_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sockTff7b72.Td2a8ffpendingTb4b4b4(Tb4b4b4) T8b949e# type: ignore[union-attr]
T8b949e# if bytes are pending do not wait in select
Tff7b72if Te6edf3pending_bytes Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3timeout Tff7b72= T79c0ff0.0
T8b949e# sockpairR is used to break out of select() before the timeout, on a
T8b949e# call to publish() etc.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairR Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3rlist Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3rlist Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_sockpairRTb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3socklist Tff7b72= Te6edf3selectTff7b72.Td2a8ffselectTb4b4b4(Te6edf3rlistTb4b4b4, Te6edf3wlistTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3timeoutTb4b4b4)
Tff7b72except Tf85149TypeErrorTb4b4b4:
T8b949e# Socket isn't correct type, in likelihood connection is lost
T8b949e# ... or we called disconnect(). In that case the socket will
T8b949e# be closed but some loop (like loop_forever) will continue to
T8b949e# call _loop(). We still want to break that loop by returning an
T8b949e# rc != MQTT_ERR_SUCCESS and we don't want state to change from
T8b949e# mqtt_cs_disconnecting.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72not Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTION_LOST
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72except Tf85149ValueErrorTb4b4b4:
T8b949e# Can occur if we just reconnected but rlist/wlist contain a -1 for
T8b949e# some reason.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72not Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTION_LOST
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72except Tf85149ExceptionTb4b4b4:
T8b949e# Note that KeyboardInterrupt, etc. can still terminate since they
T8b949e# are not derived from Exception
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_UNKNOWN
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72in Te6edf3socklistTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72or Te6edf3pending_bytes Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ffloop_readTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72or Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairR Tff7b72and Tff7b72selfTff7b72.Td2a8ff_sockpairR Tff7b72in Te6edf3socklistTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4:
T8b949e# Stimulate output write even though we didn't ask for it, because
T8b949e# at that point the publish or other command wasn't present.
Te6edf3socklistTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4)
T8b949e# Clear sockpairR - only ever a single byte written.
Tff7b72tryTb4b4b4:
T8b949e# Read many bytes at once - this allows up to 10000 calls to
T8b949e# publish() inbetween calls to loop().
Tff7b72selfTff7b72.Td2a8ff_sockpairRTff7b72.Td2a8ffrecvTb4b4b4(T79c0ff10000Tb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72pass
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72in Te6edf3socklistTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ffloop_writeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72or Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72return Tff7b72selfTff7b72.Td2a8ffloop_miscTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpublishTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3topicTb4b4b4: Tffa657strTb4b4b4,
Te6edf3payloadTb4b4b4: Te6edf3PayloadType Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3qosTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3retainTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTMessageInfoTb4b4b4:
T8b949e"""Publish a message on a topic.
This causes a message to be sent to the broker and subsequently from
the broker to any clients subscribing to matching topics.
:param str topic: The topic that the message should be published on.
:param payload: The actual message to send. If not given, or set to None a
zero length message will be used. Passing an int or float will result
in the payload being converted to a string representing that number. If
you wish to send a true int/float, use struct.pack() to create the
payload you require.
:param int qos: The quality of service level to use.
:param bool retain: If set to true, the message will be set as the "last known
good"/retained message for the topic.
:param Properties properties: (MQTT v5.0 only) the MQTT v5.0 properties to be included.
Returns a `MQTTMessageInfo` class, which can be used to determine whether
the message has been delivered (using `is_published()`) or to block
waiting for the message to be delivered (`wait_for_publish()`). The
message ID and return code of the publish() call can be found at
:py:attr:`info.mid <MQTTMessage.mid>` and :py:attr:`info.rc <MQTTMessage.rc>`.
For backwards compatibility, the `MQTTMessageInfo` class is iterable so
the old construct of ``(rc, mid) = client.publish(...)`` is still valid.
rc is MQTT_ERR_SUCCESS to indicate success or MQTT_ERR_NO_CONN if the
client is not currently connected. mid is the message ID for the
publish request. The mid value can be used to track the publish request
by checking against the mid argument in the on_publish() callback if it
is defined.
:raises ValueError: if topic is None, has zero length or is
invalid (contains a wildcard), except if the MQTT version used is v5.0.
For v5.0, a zero length topic can be used when a Topic Alias has been set.
:raises ValueError: if qos is not one of 0, 1 or 2
:raises ValueError: if the length of the payload is greater than 268435455 bytes.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72!= Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3topic Tff7b72is Tff7b72None Tff7b72or Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Te6edf3topic_bytes Tff7b72= Te6edf3topicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_raise_for_invalid_topicTb4b4b4(Te6edf3topic_bytesTb4b4b4)
Tff7b72if Te6edf3qos Tff7b72< T79c0ff0 Tff7b72or Te6edf3qos Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid QoS level.Ta5d6ff'Tb4b4b4)
Te6edf3local_payload Tff7b72= Te6edf3_encode_payloadTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3local_payloadTb4b4b4) Tff7b72> T79c0ff268435455Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffPayload too large.Ta5d6ff'Tb4b4b4)
Te6edf3local_mid Tff7b72= Tff7b72selfTff7b72.Td2a8ff_mid_generateTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3qos Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3info Tff7b72= Te6edf3MQTTMessageInfoTb4b4b4(Te6edf3local_midTb4b4b4)
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(
Te6edf3local_midTb4b4b4, Te6edf3topic_bytesTb4b4b4, Te6edf3local_payloadTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3retainTb4b4b4, Tff7b72FalseTb4b4b4, Te6edf3infoTb4b4b4, Te6edf3propertiesTb4b4b4)
Te6edf3infoTff7b72.Td2a8ffrc Tff7b72= Te6edf3rc
Tff7b72return Te6edf3info
Tff7b72elseTb4b4b4:
Te6edf3message Tff7b72= Te6edf3MQTTMessageTb4b4b4(Te6edf3local_midTb4b4b4, Te6edf3topic_bytesTb4b4b4)
Te6edf3messageTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Te6edf3messageTff7b72.Td2a8ffpayload Tff7b72= Te6edf3local_payload
Te6edf3messageTff7b72.Td2a8ffqos Tff7b72= Te6edf3qos
Te6edf3messageTff7b72.Td2a8ffretain Tff7b72= Te6edf3retain
Te6edf3messageTff7b72.Td2a8ffdup Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8ffproperties Tff7b72= Te6edf3properties
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_max_queued_messages Tff7b72> T79c0ff0 Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_max_queued_messagesTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffinfoTff7b72.Td2a8ffrc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_QUEUE_SIZE
Tff7b72return Te6edf3messageTff7b72.Td2a8ffinfo
Tff7b72if Te6edf3local_mid Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffinfoTff7b72.Td2a8ffrc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_QUEUE_SIZE
Tff7b72return Te6edf3messageTff7b72.Td2a8ffinfo
Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4[Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4] Tff7b72= Te6edf3message
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72== T79c0ff0 Tff7b72or Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72< Tff7b72selfTff7b72.Td2a8ff_max_inflight_messagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3qos Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_puback
Tff7b72elif Te6edf3qos Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubrec
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4, Te6edf3topic_bytesTb4b4b4, Te6edf3messageTff7b72.Td2a8ffpayloadTb4b4b4, Te6edf3messageTff7b72.Td2a8ffqosTb4b4b4, Te6edf3messageTff7b72.Td2a8ffretainTb4b4b4,
Te6edf3messageTff7b72.Td2a8ffdupTb4b4b4, Te6edf3messageTff7b72.Td2a8ffinfoTb4b4b4, Te6edf3messageTff7b72.Td2a8ffpropertiesTb4b4b4)
T8b949e# remove from inflight messages so it will be send after a connection is made
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONNTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72-Tff7b72= T79c0ff1
Te6edf3messageTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_publish
Te6edf3messageTff7b72.Td2a8ffinfoTff7b72.Td2a8ffrc Tff7b72= Te6edf3rc
Tff7b72return Te6edf3messageTff7b72.Td2a8ffinfo
Tff7b72elseTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_queued
Te6edf3messageTff7b72.Td2a8ffinfoTff7b72.Td2a8ffrc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72return Te6edf3messageTff7b72.Td2a8ffinfo
Tff7b72def Td2a8ffusername_pw_setTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3usernameTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4, Te6edf3passwordTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Set a username and optionally a password for broker authentication.
Must be called before connect() to have any effect.
Requires a broker that supports MQTT v3.1 or more.
:param str username: The username to authenticate with. Need have no relationship to the client id. Must be str
[MQTT-3.1.3-11].
Set to None to reset client back to not using username/password for broker authentication.
:param str password: The password to authenticate with. Optional, set to None if not required. If it is str, then it
will be encoded as UTF-8.
"""
T8b949e# [MQTT-3.1.3-11] User name must be UTF-8 encoded string
Tff7b72selfTff7b72.Td2a8ff_username Tff7b72= Tff7b72None Tff7b72if Te6edf3username Tff7b72is Tff7b72None Tff7b72else Te6edf3usernameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3passwordTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_password Tff7b72= Te6edf3passwordTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_password Tff7b72= Te6edf3password
Tff7b72def Td2a8ffenable_bridge_modeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Sets the client in a bridge mode instead of client mode.
Must be called before `connect()` to have any effect.
Requires brokers that support bridge mode.
Under bridge mode, the broker will identify the client as a bridge and
not send it's own messages back to it. Hence a subsciption of # is
possible without message loops. This feature also correctly propagates
the retain flag on the messages.
Currently Mosquitto and RSMB support this feature. This feature can
be used to create a bridge between multiple broker.
"""
Tff7b72selfTff7b72.Td2a8ff_client_mode Tff7b72= Te6edf3MQTT_BRIDGE
Tff7b72def Td2a8ff_connection_closedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""
Return true if the connection is closed (and not trying to be opened).
"""
Tff7b72return Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72== Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_NEW
Tff7b72or Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_state Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffis_connectedTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Returns the current status of the connection
True if connection exists
False if connection is closed
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_state Tff7b72== Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTED
Tff7b72def Td2a8ffdisconnectTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3reasoncodeTb4b4b4: Te6edf3ReasonCode Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Disconnect a connected client from the broker.
:param ReasonCode reasoncode: (MQTT v5.0 only) a ReasonCode instance setting the MQTT v5.0
reasoncode to be sent with the disconnect packet. It is optional, the receiver
then assuming that 0 (success) is the value.
:param Properties properties: (MQTT v5.0 only) a Properties instance setting the MQTT v5.0 properties
to be included. Optional - if not set, no properties are sent.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTED
Tff7b72return Te6edf3MQTT_ERR_NO_CONN
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTING
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_disconnectTb4b4b4(Te6edf3reasoncodeTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72def Td2a8ffsubscribeTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3topicTb4b4b4: Tffa657str Tff7b72| Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4] Tff7b72| Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4] Tff7b72| Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4] Tff7b72| Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4]Tb4b4b4]Tb4b4b4,
Te6edf3qosTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3optionsTb4b4b4: Te6edf3SubscribeOptions Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3MQTTErrorCodeTb4b4b4, Tffa657int Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
T8b949e"""Subscribe the client to one or more topics.
This function may be called in three different ways (and a further three for MQTT v5.0):
Simple string and integer
-------------------------
e.g. subscribe("my/topic", 2)
:topic: A string specifying the subscription topic to subscribe to.
:qos: The desired quality of service level for the subscription.
Defaults to 0.
:options and properties: Not used.
Simple string and subscribe options (MQTT v5.0 only)
----------------------------------------------------
e.g. subscribe("my/topic", options=SubscribeOptions(qos=2))
:topic: A string specifying the subscription topic to subscribe to.
:qos: Not used.
:options: The MQTT v5.0 subscribe options.
:properties: a Properties instance setting the MQTT v5.0 properties
to be included. Optional - if not set, no properties are sent.
String and integer tuple
------------------------
e.g. subscribe(("my/topic", 1))
:topic: A tuple of (topic, qos). Both topic and qos must be present in
the tuple.
:qos and options: Not used.
:properties: Only used for MQTT v5.0. A Properties instance setting the
MQTT v5.0 properties. Optional - if not set, no properties are sent.
String and subscribe options tuple (MQTT v5.0 only)
---------------------------------------------------
e.g. subscribe(("my/topic", SubscribeOptions(qos=1)))
:topic: A tuple of (topic, SubscribeOptions). Both topic and subscribe
options must be present in the tuple.
:qos and options: Not used.
:properties: a Properties instance setting the MQTT v5.0 properties
to be included. Optional - if not set, no properties are sent.
List of string and integer tuples
---------------------------------
e.g. subscribe([("my/topic", 0), ("another/topic", 2)])
This allows multiple topic subscriptions in a single SUBSCRIPTION
command, which is more efficient than using multiple calls to
subscribe().
:topic: A list of tuple of format (topic, qos). Both topic and qos must
be present in all of the tuples.
:qos, options and properties: Not used.
List of string and subscribe option tuples (MQTT v5.0 only)
-----------------------------------------------------------
e.g. subscribe([("my/topic", SubscribeOptions(qos=0), ("another/topic", SubscribeOptions(qos=2)])
This allows multiple topic subscriptions in a single SUBSCRIPTION
command, which is more efficient than using multiple calls to
subscribe().
:topic: A list of tuple of format (topic, SubscribeOptions). Both topic and subscribe
options must be present in all of the tuples.
:qos and options: Not used.
:properties: a Properties instance setting the MQTT v5.0 properties
to be included. Optional - if not set, no properties are sent.
The function returns a tuple (result, mid), where result is
MQTT_ERR_SUCCESS to indicate success or (MQTT_ERR_NO_CONN, None) if the
client is not currently connected. mid is the message ID for the
subscribe request. The mid value can be used to track the subscribe
request by checking against the mid argument in the on_subscribe()
callback if it is defined.
Raises a ValueError if qos is not 0, 1 or 2, or if topic is None or has
zero string length, or if topic is not a string, tuple or list.
"""
Te6edf3topic_qos_list Tff7b72= Tff7b72None
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tffa657tupleTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3topicTb4b4b4, Te6edf3options Tff7b72= Te6edf3topic T8b949e# type: ignore
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3optionsTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffSubscribe options must be instance of SubscribeOptions class.Ta5d6ff'Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3topicTb4b4b4, Te6edf3qos Tff7b72= Te6edf3topic T8b949e# type: ignore
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3qos Tff7b72< T79c0ff0 Tff7b72or Te6edf3qos Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid QoS level.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3options Tff7b72is Tff7b72NoneTb4b4b4:
T8b949e# if no options are provided, use the QoS passed instead
Te6edf3options Tff7b72= Te6edf3SubscribeOptionsTb4b4b4(Te6edf3qosTff7b72=Te6edf3qosTb4b4b4)
Tff7b72elif Te6edf3qos Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffSubscribe options and qos parameters cannot be combined.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3optionsTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff'Ta5d6ffSubscribe options must be instance of SubscribeOptions class.Ta5d6ff'Tb4b4b4)
Te6edf3topic_qos_list Tff7b72= Tb4b4b4[Tb4b4b4(Te6edf3topicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3optionsTb4b4b4)Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3topic Tff7b72is Tff7b72None Tff7b72or Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Te6edf3topic_qos_list Tff7b72= Tb4b4b4[Tb4b4b4(Te6edf3topicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3qosTb4b4b4)Tb4b4b4] T8b949e# type: ignore
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffEmpty topic listTa5d6ff'Tb4b4b4)
Te6edf3topic_qos_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72for Te6edf3tTb4b4b4, Te6edf3o Tff7b72in Te6edf3topicTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3oTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4)Tb4b4b4:
T8b949e# then the second value should be QoS
Tff7b72if Te6edf3o Tff7b72< T79c0ff0 Tff7b72or Te6edf3o Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid QoS level.Ta5d6ff'Tb4b4b4)
Te6edf3o Tff7b72= Te6edf3SubscribeOptionsTb4b4b4(Te6edf3qosTff7b72=Te6edf3oTb4b4b4)
Te6edf3topic_qos_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3tTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3oTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3tTb4b4b4, Te6edf3q Tff7b72in Te6edf3topicTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3qTb4b4b4, Te6edf3SubscribeOptionsTb4b4b4) Tff7b72or Te6edf3q Tff7b72< T79c0ff0 Tff7b72or Te6edf3q Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid QoS level.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3t Tff7b72is Tff7b72None Tff7b72or Tffa657lenTb4b4b4(Te6edf3tTb4b4b4) Tff7b72== T79c0ff0 Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3tTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Te6edf3topic_qos_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3tTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3qTb4b4b4)Tb4b4b4) T8b949e# type: ignore
Tff7b72if Te6edf3topic_qos_list Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo topic specified, or incorrect topic type.Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_filter_wildcard_len_checkTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72!= Te6edf3MQTT_ERR_SUCCESS Tff7b72for Te6edf3topicTb4b4b4, Te6edf3_ Tff7b72in Te6edf3topic_qos_listTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid subscription filter.Ta5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4(Te6edf3MQTT_ERR_NO_CONNTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_subscribeTb4b4b4(Tff7b72FalseTb4b4b4, Te6edf3topic_qos_listTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72def Td2a8ffunsubscribeTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3topicTb4b4b4: Tffa657str Tff7b72| Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4, Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3MQTTErrorCodeTb4b4b4, Tffa657int Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
T8b949e"""Unsubscribe the client from one or more topics.
:param topic: A single string, or list of strings that are the subscription
topics to unsubscribe from.
:param properties: (MQTT v5.0 only) a Properties instance setting the MQTT v5.0 properties
to be included. Optional - if not set, no properties are sent.
Returns a tuple (result, mid), where result is MQTT_ERR_SUCCESS
to indicate success or (MQTT_ERR_NO_CONN, None) if the client is not
currently connected.
mid is the message ID for the unsubscribe request. The mid value can be
used to track the unsubscribe request by checking against the mid
argument in the on_unsubscribe() callback if it is defined.
:raises ValueError: if topic is None or has zero string length, or is
not a string or list.
"""
Te6edf3topic_list Tff7b72= Tff7b72None
Tff7b72if Te6edf3topic Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Te6edf3topic_list Tff7b72= Tb4b4b4[Te6edf3topicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4]
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3topic_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3t Tff7b72in Te6edf3topicTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tTb4b4b4) Tff7b72== T79c0ff0 Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3tTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Te6edf3topic_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3topic_list Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo topic specified, or incorrect topic type.Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4(Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONNTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_unsubscribeTb4b4b4(Tff7b72FalseTb4b4b4, Te6edf3topic_listTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72def Td2a8ffloop_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3max_packetsTb4b4b4: Tffa657int Tff7b72= T79c0ff1Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Process read network events. Use in place of calling `loop()` if you
wish to handle your client reads as part of your own application.
Use `socket()` to obtain the client socket to call select() or equivalent
on.
Do not use if you are using `loop_start()` or `loop_forever()`."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Te6edf3max_packets Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_messagesTb4b4b4)
Tff7b72if Te6edf3max_packets Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3max_packets Tff7b72= T79c0ff1
Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3max_packetsTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_packet_readTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_loop_rc_handleTb4b4b4(Te6edf3rcTb4b4b4)
Tff7b72elif Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAINTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ffloop_writeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Process write network events. Use in place of calling `loop()` if you
wish to handle your client writes as part of your own application.
Use `socket()` to obtain the client socket to call select() or equivalent
on.
Use `want_write()` to determine if there is data waiting to be written.
Do not use if you are using `loop_start()` or `loop_forever()`."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Tff7b72tryTb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_packet_writeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAINTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elif Te6edf3rc Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_loop_rc_handleTb4b4b4(Te6edf3rcTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72finallyTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwant_writeTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_call_socket_register_writeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_call_socket_unregister_writeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffwant_writeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Call to determine if there is network data waiting to be written.
Useful if you are calling select() yourself rather than using `loop()`, `loop_start()` or `loop_forever()`.
"""
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_out_packetTb4b4b4) Tff7b72> T79c0ff0
Tff7b72def Td2a8ffloop_miscTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""Process miscellaneous network events. Use in place of calling `loop()` if you
wish to call select() or equivalent on.
Do not use if you are using `loop_start()` or `loop_forever()`."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Te6edf3now Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_check_keepaliveTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72> T79c0ff0 Tff7b72and Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_keepaliveTb4b4b4:
T8b949e# client->ping_t != 0 means we are waiting for a pingresp.
T8b949e# This hasn't happened in the keepalive time so we should disconnect.
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTED
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTION_LOST
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_KEEPALIVE
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(
Te6edf3packet_from_brokerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3v1_rcTff7b72=Te6edf3rcTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ffmax_inflight_messages_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3inflightTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Set the maximum number of messages with QoS>0 that can be part way
through their network flow at once. Defaults to 20."""
Tff7b72selfTff7b72.Td2a8ffmax_inflight_messages Tff7b72= Te6edf3inflight
Tff7b72def Td2a8ffmax_queued_messages_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3queue_sizeTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3ClientTb4b4b4:
T8b949e"""Set the maximum number of messages in the outgoing message queue.
0 means unlimited."""
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3queue_sizeTb4b4b4, Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid type of queue size.Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmax_queued_messages Tff7b72= Te6edf3queue_size
Tff7b72return Tff7b72self
Tff7b72def Td2a8ffuser_data_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3userdataTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Set the user data variable passed to callbacks. May be any data type."""
Tff7b72selfTff7b72.Td2a8ff_userdata Tff7b72= Te6edf3userdata
Tff7b72def Td2a8ffuser_data_getTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Get the user data variable passed to callbacks. May be any data type."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_userdata
Tff7b72def Td2a8ffwill_setTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3topicTb4b4b4: Tffa657strTb4b4b4,
Te6edf3payloadTb4b4b4: Te6edf3PayloadType Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3qosTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3retainTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Set a Will to be sent by the broker in case the client disconnects unexpectedly.
This must be called before connect() to have any effect.
:param str topic: The topic that the will message should be published on.
:param payload: The message to send as a will. If not given, or set to None a
zero length message will be used as the will. Passing an int or float
will result in the payload being converted to a string representing
that number. If you wish to send a true int/float, use struct.pack() to
create the payload you require.
:param int qos: The quality of service level to use for the will.
:param bool retain: If set to true, the will message will be set as the "last known
good"/retained message for the topic.
:param Properties properties: (MQTT v5.0 only) the MQTT v5.0 properties
to be included with the will message. Optional - if not set, no properties are sent.
:raises ValueError: if qos is not 0, 1 or 2, or if topic is None or has
zero string length.
See `will_clear` to clear will. Note that will are NOT send if the client disconnect cleanly
for example by calling `disconnect()`.
"""
Tff7b72if Te6edf3topic Tff7b72is Tff7b72None Tff7b72or Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid topic.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3qos Tff7b72< T79c0ff0 Tff7b72or Te6edf3qos Tff7b72> T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid QoS level.Ta5d6ff'Tb4b4b4)
Tff7b72if Te6edf3properties Tff7b72and Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3propertiesTb4b4b4, Te6edf3PropertiesTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffThe properties argument must be an instance of the Properties class.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_will_payload Tff7b72= Te6edf3_encode_payloadTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_will Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_will_topic Tff7b72= Te6edf3topicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_will_qos Tff7b72= Te6edf3qos
Tff7b72selfTff7b72.Td2a8ff_will_retain Tff7b72= Te6edf3retain
Tff7b72selfTff7b72.Td2a8ff_will_properties Tff7b72= Te6edf3properties
Tff7b72def Td2a8ffwill_clearTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e""" Removes a will that was previously configured with `will_set()`.
Must be called before connect() to have any effect."""
Tff7b72selfTff7b72.Td2a8ff_will Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_will_topic Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_will_payload Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_will_qos Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_will_retain Tff7b72= Tff7b72False
Tff7b72def Td2a8ffsocketTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3SocketLike Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Return the socket or ssl object for this client."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_sock
Tff7b72def Td2a8ffloop_foreverTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff1.0Tb4b4b4,
Te6edf3retry_first_connectionTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""This function calls the network loop functions for you in an
infinite blocking loop. It is useful for the case where you only want
to run the MQTT client loop in your program.
loop_forever() will handle reconnecting for you if reconnect_on_failure is
true (this is the default behavior). If you call `disconnect()` in a callback
it will return.
:param int timeout: The time in seconds to wait for incoming/outgoing network
traffic before timing out and returning.
:param bool retry_first_connection: Should the first connection attempt be retried on failure.
This is independent of the reconnect_on_failure setting.
:raises OSError: if the first connection fail unless retry_first_connection=True
"""
Te6edf3run Tff7b72= Tff7b72True
Tff7b72while Te6edf3runTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72break
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72== Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECT_ASYNCTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_on_connect_failTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3retry_first_connectionTb4b4b4:
Tff7b72raise
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffConnection failed, retryingTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_reconnect_waitTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72break
Tff7b72while Te6edf3runTb4b4b4:
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72while Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_loopTb4b4b4(Te6edf3timeoutTb4b4b4)
T8b949e# We don't need to worry about locking here, because we've
T8b949e# either called loop_forever() when in single threaded mode, or
T8b949e# in multi threaded mode when loop_stop() has been called and
T8b949e# so no other threads can access _out_packet or _messages.
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72is Tff7b72True
Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_out_packetTb4b4b4) Tff7b72== T79c0ff0
Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NOMEM
Te6edf3run Tff7b72= Tff7b72False
Tff7b72def Td2a8ffshould_exitTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4) Tff7b72or
Te6edf3run Tff7b72is Tff7b72False Tff7b72or T8b949e# noqa: B023 (uses the run variable from the outer scope on purpose)
Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72is Tff7b72True
Tb4b4b4)
Tff7b72if Te6edf3should_exitTb4b4b4(Tb4b4b4) Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ff_reconnect_on_failureTb4b4b4:
Te6edf3run Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_waitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3should_exitTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3run Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_on_connect_failTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffConnection failed, retryingTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ffloop_startTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""This is part of the threaded client interface. Call this once to
start a new thread to process network traffic. This provides an
alternative to repeatedly calling `loop()` yourself.
Under the hood, this will call `loop_forever` in a thread, which means that
the thread will terminate if you call `disconnect()`
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_INVAL
Tff7b72selfTff7b72.Td2a8ff_sockpairRTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_sockpairW Tff7b72= Te6edf3_socketpair_compatTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_thread_mainTb4b4b4, Te6edf3nameTff7b72=Ta5d6fffTa5d6ff"Ta5d6ffpaho-mqtt-client-Tffd700{Tff7b72selfTff7b72.Td2a8ff_client_idTff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ffloop_stopTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""This is part of the threaded client interface. Call this once to
stop the network thread previously created with `loop_start()`. This call
will block until the network thread finishes.
This don't guarantee that publish packet are sent, use `wait_for_publish` or
`on_publish` to ensure `publish` are sent.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_INVAL
Tff7b72selfTff7b72.Td2a8ff_thread_terminate Tff7b72= Tff7b72True
Tff7b72if Te6edf3threadingTff7b72.Td2a8ffcurrent_threadTb4b4b4(Tb4b4b4) Tff7b72!= Tff7b72selfTff7b72.Td2a8ff_threadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_threadTff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tf0883e@property
Tff7b72def Td2a8ffcallback_api_versionTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackAPIVersionTb4b4b4:
T8b949e"""
Return the callback API version used for user-callback. See docstring for
each user-callback (`on_connect`, `on_publish`, ...) for details.
This property is read-only.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_callback_api_version
Tf0883e@property
Tff7b72def Td2a8ffon_logTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnLog Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the client has log information.
Defined to allow debugging.
Expected signature is::
log_callback(client, userdata, level, buf)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param int level: gives the severity of the message and will be one of
MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING,
MQTT_LOG_ERR, and MQTT_LOG_DEBUG.
:param str buf: the message itself
Decorator: @client.log_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_log
Tf0883e@on_logTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_logTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnLog Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_log Tff7b72= Te6edf3func
Tff7b72def Td2a8fflog_callbackTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnLogTb4b4b4]Tb4b4b4, Te6edf3CallbackOnLogTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnLogTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnLogTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_log Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_pre_connectTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnPreConnect Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called immediately prior to the connection is made
request.
Expected signature (for all callback API version)::
connect_callback(client, userdata)
:parama Client client: the client instance for this callback
:parama userdata: the private user data as set in Client() or user_data_set()
Decorator: @client.pre_connect_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_pre_connect
Tf0883e@on_pre_connectTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_pre_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnPreConnect Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_pre_connect Tff7b72= Te6edf3func
Tff7b72def Td2a8ffpre_connect_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnPreConnectTb4b4b4]Tb4b4b4, Te6edf3CallbackOnPreConnectTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnPreConnectTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnPreConnectTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_pre_connect Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_connectTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnConnect Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the broker reponds to our connection request.
Expected signature for callback API version 2::
connect_callback(client, userdata, connect_flags, reason_code, properties)
Expected signature for callback API version 1 change with MQTT protocol version:
* For MQTT v3.1 and v3.1.1 it's::
connect_callback(client, userdata, flags, rc)
* For MQTT v5.0 it's::
connect_callback(client, userdata, flags, reason_code, properties)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param ConnectFlags connect_flags: the flags for this connection
:param ReasonCode reason_code: the connection reason code received from the broken.
In MQTT v5.0 it's the reason code defined by the standard.
In MQTT v3, we convert return code to a reason code, see
`convert_connack_rc_to_reason_code()`.
`ReasonCode` may be compared to integer.
:param Properties properties: the MQTT v5.0 properties received from the broker.
For MQTT v3.1 and v3.1.1 properties is not provided and an empty Properties
object is always used.
:param dict flags: response flags sent by the broker
:param int rc: the connection result, should have a value of `ConnackCode`
flags is a dict that contains response flags from the broker:
flags['session present'] - this flag is useful for clients that are
using clean session set to 0 only. If a client with clean
session=0, that reconnects to a broker that it has previously
connected to, this flag indicates whether the broker still has the
session information for the client. If 1, the session still exists.
The value of rc indicates success or not:
- 0: Connection successful
- 1: Connection refused - incorrect protocol version
- 2: Connection refused - invalid client identifier
- 3: Connection refused - server unavailable
- 4: Connection refused - bad username or password
- 5: Connection refused - not authorised
- 6-255: Currently unused.
Decorator: @client.connect_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_connect
Tf0883e@on_connectTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnConnect Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_connect Tff7b72= Te6edf3func
Tff7b72def Td2a8ffconnect_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnConnectTb4b4b4]Tb4b4b4, Te6edf3CallbackOnConnectTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnConnectTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnConnectTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_connect Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_connect_failTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnConnectFail Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the client failed to connect
to the broker.
Expected signature is (for all callback_api_version)::
connect_fail_callback(client, userdata)
:param Client client: the client instance for this callback
:parama userdata: the private user data as set in Client() or user_data_set()
Decorator: @client.connect_fail_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_connect_fail
Tf0883e@on_connect_failTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_connect_failTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnConnectFail Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_connect_fail Tff7b72= Te6edf3func
Tff7b72def Td2a8ffconnect_fail_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnConnectFailTb4b4b4]Tb4b4b4, Te6edf3CallbackOnConnectFailTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnConnectFailTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnConnectFailTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_connect_fail Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_subscribeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSubscribe Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the broker responds to a subscribe
request.
Expected signature for callback API version 2::
subscribe_callback(client, userdata, mid, reason_code_list, properties)
Expected signature for callback API version 1 change with MQTT protocol version:
* For MQTT v3.1 and v3.1.1 it's::
subscribe_callback(client, userdata, mid, granted_qos)
* For MQTT v5.0 it's::
subscribe_callback(client, userdata, mid, reason_code_list, properties)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param int mid: matches the mid variable returned from the corresponding
subscribe() call.
:param list[ReasonCode] reason_code_list: reason codes received from the broker for each subscription.
In MQTT v5.0 it's the reason code defined by the standard.
In MQTT v3, we convert granted QoS to a reason code.
It's a list of ReasonCode instances.
:param Properties properties: the MQTT v5.0 properties received from the broker.
For MQTT v3.1 and v3.1.1 properties is not provided and an empty Properties
object is always used.
:param list[int] granted_qos: list of integers that give the QoS level the broker has
granted for each of the different subscription requests.
Decorator: @client.subscribe_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_subscribe
Tf0883e@on_subscribeTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_subscribeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnSubscribe Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_subscribe Tff7b72= Te6edf3func
Tff7b72def Td2a8ffsubscribe_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnSubscribeTb4b4b4]Tb4b4b4, Te6edf3CallbackOnSubscribeTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnSubscribeTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSubscribeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_subscribe Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_messageTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnMessage Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when a message has been received on a topic
that the client subscribes to.
This callback will be called for every message received unless a
`message_callback_add()` matched the message.
Expected signature is (for all callback API version):
message_callback(client, userdata, message)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param MQTTMessage message: the received message.
This is a class with members topic, payload, qos, retain.
Decorator: @client.message_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_message
Tf0883e@on_messageTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnMessage Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_message Tff7b72= Te6edf3func
Tff7b72def Td2a8ffmessage_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnMessageTb4b4b4]Tb4b4b4, Te6edf3CallbackOnMessageTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnMessageTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnMessageTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_message Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_publishTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnPublish Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when a message that was to be sent using the
`publish()` call has completed transmission to the broker.
For messages with QoS levels 1 and 2, this means that the appropriate
handshakes have completed. For QoS 0, this simply means that the message
has left the client.
This callback is important because even if the `publish()` call returns
success, it does not always mean that the message has been sent.
See also `wait_for_publish` which could be simpler to use.
Expected signature for callback API version 2::
publish_callback(client, userdata, mid, reason_code, properties)
Expected signature for callback API version 1::
publish_callback(client, userdata, mid)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param int mid: matches the mid variable returned from the corresponding
`publish()` call, to allow outgoing messages to be tracked.
:param ReasonCode reason_code: the connection reason code received from the broken.
In MQTT v5.0 it's the reason code defined by the standard.
In MQTT v3 it's always the reason code Success
:parama Properties properties: the MQTT v5.0 properties received from the broker.
For MQTT v3.1 and v3.1.1 properties is not provided and an empty Properties
object is always used.
Note: for QoS = 0, the reason_code and the properties don't really exist, it's the client
library that generate them. It's always an empty properties and a success reason code.
Because the (MQTTv5) standard don't have reason code for PUBLISH packet, the library create them
at PUBACK packet, as if the message was sent with QoS = 1.
Decorator: @client.publish_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_publish
Tf0883e@on_publishTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_publishTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnPublish Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_publish Tff7b72= Te6edf3func
Tff7b72def Td2a8ffpublish_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnPublishTb4b4b4]Tb4b4b4, Te6edf3CallbackOnPublishTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnPublishTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnPublishTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_publish Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_unsubscribeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnUnsubscribe Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the broker responds to an unsubscribe
request.
Expected signature for callback API version 2::
unsubscribe_callback(client, userdata, mid, reason_code_list, properties)
Expected signature for callback API version 1 change with MQTT protocol version:
* For MQTT v3.1 and v3.1.1 it's::
unsubscribe_callback(client, userdata, mid)
* For MQTT v5.0 it's::
unsubscribe_callback(client, userdata, mid, properties, v1_reason_codes)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param mid: matches the mid variable returned from the corresponding
unsubscribe() call.
:param list[ReasonCode] reason_code_list: reason codes received from the broker for each unsubscription.
In MQTT v5.0 it's the reason code defined by the standard.
In MQTT v3, there is not equivalent from broken and empty list
is always used.
:param Properties properties: the MQTT v5.0 properties received from the broker.
For MQTT v3.1 and v3.1.1 properties is not provided and an empty Properties
object is always used.
:param v1_reason_codes: the MQTT v5.0 reason codes received from the broker for each
unsubscribe topic. A list of ReasonCode instances OR a single
ReasonCode when we unsubscribe from a single topic.
Decorator: @client.unsubscribe_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_unsubscribe
Tf0883e@on_unsubscribeTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_unsubscribeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnUnsubscribe Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_unsubscribe Tff7b72= Te6edf3func
Tff7b72def Td2a8ffunsubscribe_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnUnsubscribeTb4b4b4]Tb4b4b4, Te6edf3CallbackOnUnsubscribeTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnUnsubscribeTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnUnsubscribeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_unsubscribe Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_disconnectTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnDisconnect Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the client disconnects from the broker.
Expected signature for callback API version 2::
disconnect_callback(client, userdata, disconnect_flags, reason_code, properties)
Expected signature for callback API version 1 change with MQTT protocol version:
* For MQTT v3.1 and v3.1.1 it's::
disconnect_callback(client, userdata, rc)
* For MQTT v5.0 it's::
disconnect_callback(client, userdata, reason_code, properties)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param DisconnectFlag disconnect_flags: the flags for this disconnection.
:param ReasonCode reason_code: the disconnection reason code possibly received from the broker (see disconnect_flags).
In MQTT v5.0 it's the reason code defined by the standard.
In MQTT v3 it's never received from the broker, we convert an MQTTErrorCode,
see `convert_disconnect_error_code_to_reason_code()`.
`ReasonCode` may be compared to integer.
:param Properties properties: the MQTT v5.0 properties received from the broker.
For MQTT v3.1 and v3.1.1 properties is not provided and an empty Properties
object is always used.
:param int rc: the disconnection result
The rc parameter indicates the disconnection state. If
MQTT_ERR_SUCCESS (0), the callback was called in response to
a disconnect() call. If any other value the disconnection
was unexpected, such as might be caused by a network error.
Decorator: @client.disconnect_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_disconnect
Tf0883e@on_disconnectTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_disconnectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnDisconnect Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_disconnect Tff7b72= Te6edf3func
Tff7b72def Td2a8ffdisconnect_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnDisconnectTb4b4b4]Tb4b4b4, Te6edf3CallbackOnDisconnectTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnDisconnectTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnDisconnectTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_disconnect Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tf0883e@property
Tff7b72def Td2a8ffon_socket_openTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called just after the socket was opend.
This should be used to register the socket to an external event loop for reading.
Expected signature is (for all callback API version)::
socket_open_callback(client, userdata, socket)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param SocketLike sock: the socket which was just opened.
Decorator: @client.socket_open_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_socket_open
Tf0883e@on_socket_openTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_socket_openTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_open Tff7b72= Te6edf3func
Tff7b72def Td2a8ffsocket_open_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4, Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocketTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_socket_open Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ff_call_socket_openTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sockTb4b4b4: Te6edf3SocketLikeTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Call the socket_open callback with the just-opened socket"""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_socket_open Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_socket_open
Tff7b72if Te6edf3on_socket_openTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_socket_openTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3sockTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_socket_open: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tf0883e@property
Tff7b72def Td2a8ffon_socket_closeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called just before the socket is closed.
This should be used to unregister the socket from an external event loop for reading.
Expected signature is (for all callback API version)::
socket_close_callback(client, userdata, socket)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param SocketLike sock: the socket which is about to be closed.
Decorator: @client.socket_close_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_socket_close
Tf0883e@on_socket_closeTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_socket_closeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_close Tff7b72= Te6edf3func
Tff7b72def Td2a8ffsocket_close_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4, Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocketTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_socket_close Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ff_call_socket_closeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sockTb4b4b4: Te6edf3SocketLikeTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Call the socket_close callback with the about-to-be-closed socket"""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_socket_close Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_socket_close
Tff7b72if Te6edf3on_socket_closeTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_socket_closeTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3sockTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_socket_close: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tf0883e@property
Tff7b72def Td2a8ffon_socket_register_writeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the socket needs writing but can't.
This should be used to register the socket with an external event loop for writing.
Expected signature is (for all callback API version)::
socket_register_write_callback(client, userdata, socket)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param SocketLike sock: the socket which should be registered for writing
Decorator: @client.socket_register_write_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_socket_register_write
Tf0883e@on_socket_register_writeTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_socket_register_writeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_register_write Tff7b72= Te6edf3func
Tff7b72def Td2a8ffsocket_register_write_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4, Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocketTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_register_write Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ff_call_socket_register_writeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Call the socket_register_write callback with the unwritable socket"""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72or Tff7b72selfTff7b72.Td2a8ff_registered_writeTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_registered_write Tff7b72= Tff7b72True
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_socket_register_write Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_socket_register_write
Tff7b72if Te6edf3on_socket_register_writeTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_socket_register_writeTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_sockTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_socket_register_write: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tf0883e@property
Tff7b72def Td2a8ffon_socket_unregister_writeTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocket Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""The callback called when the socket doesn't need writing anymore.
This should be used to unregister the socket from an external event loop for writing.
Expected signature is (for all callback API version)::
socket_unregister_write_callback(client, userdata, socket)
:param Client client: the client instance for this callback
:param userdata: the private user data as set in Client() or user_data_set()
:param SocketLike sock: the socket which should be unregistered for writing
Decorator: @client.socket_unregister_write_callback() (``client`` is the name of the
instance which this callback is being attached to)
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_on_socket_unregister_write
Tf0883e@on_socket_unregister_writeTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffon_socket_unregister_writeTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocket Tff7b72| Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_unregister_write Tff7b72= Te6edf3func
Tff7b72def Td2a8ffsocket_unregister_write_callbackTb4b4b4(
Tff7b72selfTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4, Te6edf3CallbackOnSocketTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(
Te6edf3funcTb4b4b4: Te6edf3CallbackOnSocketTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnSocketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_socket_unregister_write Tff7b72= Te6edf3func
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ff_call_socket_unregister_writeTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3sockTb4b4b4: Te6edf3SocketLike Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Call the socket_unregister_write callback with the writable socket"""
Te6edf3sock Tff7b72= Te6edf3sock Tff7b72or Tff7b72selfTff7b72.Td2a8ff_sock
Tff7b72if Tff7b72not Te6edf3sock Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ff_registered_writeTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_registered_write Tff7b72= Tff7b72False
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_socket_unregister_write Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_socket_unregister_write
Tff7b72if Te6edf3on_socket_unregister_writeTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_socket_unregister_writeTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3sockTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_socket_unregister_write: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72def Td2a8ffmessage_callback_addTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3subTb4b4b4: Tffa657strTb4b4b4, Te6edf3callbackTb4b4b4: Te6edf3CallbackOnMessageTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Register a message callback for a specific topic.
Messages that match 'sub' will be passed to 'callback'. Any
non-matching messages will be passed to the default `on_message`
callback.
Call multiple times with different 'sub' to define multiple topic
specific callbacks.
Topic specific callbacks may be removed with
`message_callback_remove()`.
See `on_message` for the expected signature of the callback.
Decorator: @client.topic_callback(sub) (``client`` is the name of the
instance which this callback is being attached to)
Example::
@client.topic_callback("mytopic/#")
def handle_mytopic(client, userdata, message):
...
"""
Tff7b72if Te6edf3callback Tff7b72is Tff7b72None Tff7b72or Te6edf3sub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffsub and callback must both be defined.Ta5d6ff"Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_message_filteredTb4b4b4[Te6edf3subTb4b4b4] Tff7b72= Te6edf3callback
Tff7b72def Td2a8fftopic_callbackTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3subTb4b4b4: Tffa657str
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3CallableTb4b4b4[Tb4b4b4[Te6edf3CallbackOnMessageTb4b4b4]Tb4b4b4, Te6edf3CallbackOnMessageTb4b4b4]Tb4b4b4:
Tff7b72def Td2a8ffdecoratorTb4b4b4(Te6edf3funcTb4b4b4: Te6edf3CallbackOnMessageTb4b4b4) Tff7b72-Tff7b72> Te6edf3CallbackOnMessageTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_callback_addTb4b4b4(Te6edf3subTb4b4b4, Te6edf3funcTb4b4b4)
Tff7b72return Te6edf3func
Tff7b72return Te6edf3decorator
Tff7b72def Td2a8ffmessage_callback_removeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3subTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Remove a message callback previously registered with
`message_callback_add()`."""
Tff7b72if Te6edf3sub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffsub must defined.Ta5d6ff"Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72del Tff7b72selfTff7b72.Td2a8ff_on_message_filteredTb4b4b4[Te6edf3subTb4b4b4]
Tff7b72except Tf85149KeyErrorTb4b4b4: T8b949e# no such subscription
Tff7b72pass
T8b949e# ============================================================
T8b949e# Private functions
T8b949e# ============================================================
Tff7b72def Td2a8ff_loop_rc_handleTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3rcTb4b4b4: Te6edf3MQTTErrorCodeTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Te6edf3rcTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTED
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(Te6edf3packet_from_brokerTff7b72=Tff7b72FalseTb4b4b4, Te6edf3v1_rcTff7b72=Te6edf3rcTb4b4b4)
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTT_ERR_CONN_LOSTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTION_LOST
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ff_packet_readTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e# This gets called if pselect() indicates that there is network data
T8b949e# available - ie. at least one byte. What we do depends on what data we
T8b949e# already have.
T8b949e# If we've not got a command, attempt to read one and save it. This should
T8b949e# always work because it's only a single byte.
T8b949e# Then try to read the remaining length. This may fail because it is may
T8b949e# be more than one byte - will need to save data pending next read if it
T8b949e# does fail.
T8b949e# Then try to read the remaining payload, where 'payload' here means the
T8b949e# combined variable header and actual payload. This is the most likely to
T8b949e# fail due to longer length, so save current data and current position.
T8b949e# After all data is read, send to _mqtt_handle_packet() to deal with.
T8b949e# Finally, free the memory and reset everything to starting conditions.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4] Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3command Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sock_recvTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
Tff7b72except Tf85149TimeoutError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6fftimeout on socket: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72except Tf85149OSError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6fffailed to receive on socket: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3commandTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4] Tff7b72= Te6edf3commandTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffhave_remainingTa5d6ff'Tb4b4b4] Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# Read remaining
T8b949e# Algorithm for decoding taken from pseudo code at
T8b949e# http://publib.boulder.ibm.com/infocenter/wmbhelp/v6r0m0/topic/com.ibm.etools.mft.doc/ac10870_.htm
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3byte Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sock_recvTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
Tff7b72except Tf85149OSError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6fffailed to receive on socket: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3byteTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Te6edf3byte_value Tff7b72= Te6edf3byteTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_countTa5d6ff'Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3byte_valueTb4b4b4)
T8b949e# Max 4 bytes length for remaining length as defined by protocol.
T8b949e# Anything more likely means a broken/malicious client.
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_countTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72> T79c0ff4Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72+Tff7b72= Tb4b4b4(
Te6edf3byte_value Tff7b72& T79c0ff127Tb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_multTa5d6ff'Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_multTa5d6ff'Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_multTa5d6ff'Tb4b4b4] Tff7b72* T79c0ff128
Tff7b72if Tb4b4b4(Te6edf3byte_value Tff7b72& T79c0ff128Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72break
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffhave_remainingTa5d6ff'Tb4b4b4] Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4]
Te6edf3count Tff7b72= T79c0ff100 T8b949e# Don't get stuck in this loop if we have a huge message.
Tff7b72while Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sock_recvTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
Tff7b72except Tf85149OSError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6fffailed to receive on socket: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4] Tff7b72-Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4] Tff7b72+Tff7b72= Te6edf3data
Te6edf3count Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Te6edf3count Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_in Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
T8b949e# All data for this packet is read.
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffposTa5d6ff'Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_packet_handleTb4b4b4(Tb4b4b4)
T8b949e# Free data and reset values
Tff7b72selfTff7b72.Td2a8ff_in_packet Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcommandTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffhave_remainingTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_countTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_multTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffremaining_lengthTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4: Tffa657bytearrayTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffto_processTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffposTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_in Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ff_packet_writeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffpopleftTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149IndexErrorTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72tryTb4b4b4:
Te6edf3write_length Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sock_sendTb4b4b4(
Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffposTa5d6ff'Tb4b4b4]Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149AttributeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffappendleftTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffappendleftTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_AGAIN
Tff7b72except Tf85149OSError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffappendleftTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6fffailed to receive on socket: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOST
Tff7b72if Te6edf3write_length Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4] Tff7b72-Tff7b72= Te6edf3write_length
Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffposTa5d6ff'Tb4b4b4] Tff7b72+Tff7b72= Te6edf3write_length
Tff7b72if Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffto_processTa5d6ff'Tb4b4b4] Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4] Tff7b72& T79c0ff0xF0Tb4b4b4) Tff7b72== Te6edf3PUBLISH Tff7b72and Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffqosTa5d6ff'Tb4b4b4] Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_publish Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_publish
Tff7b72if Te6edf3on_publishTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Te6edf3on_publish Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnPublish_v1Tb4b4b4, Te6edf3on_publishTb4b4b4)
Te6edf3on_publishTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3packetTb4b4b4[Ta5d6ff"Ta5d6ffmidTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_publish Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnPublish_v2Tb4b4b4, Te6edf3on_publishTb4b4b4)
Te6edf3on_publishTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3packetTb4b4b4[Ta5d6ff"Ta5d6ffmidTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3ReasonCodeTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffPUBACKTb4b4b4)Tb4b4b4,
Te6edf3PropertiesTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffPUBACKTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_publish: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
T8b949e# TODO: Something is odd here. I don't see why packet["info"] can't be None.
T8b949e# A packet could be produced by _handle_connack with qos=0 and no info
T8b949e# (around line 3645). Ignore the mypy check for now but I feel there is a bug
T8b949e# somewhere.
Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffinfoTa5d6ff'Tb4b4b4]Tff7b72.Td2a8ff_set_as_publishedTb4b4b4(Tb4b4b4) T8b949e# type: ignore
Tff7b72if Tb4b4b4(Te6edf3packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4] Tff7b72& T79c0ff0xF0Tb4b4b4) Tff7b72== Te6edf3DISCONNECTTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_out Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(
Te6edf3packet_from_brokerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3v1_rcTff7b72=Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
T8b949e# Only change to disconnected if the disconnection was wanted
T8b949e# by the client (== state was disconnecting). If the broker disconnected
T8b949e# use unilaterally don't change the state and client may reconnect.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72== Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTED
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
T8b949e# We haven't finished with this packet
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffappendleftTb4b4b4(Te6edf3packetTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72break
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_out Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_easy_logTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3levelTb4b4b4: Te6edf3LogLevelTb4b4b4, Te6edf3fmtTb4b4b4: Tffa657strTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffon_log Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3buf Tff7b72= Te6edf3fmt Tff7b72% Te6edf3args
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_logTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3levelTb4b4b4, Te6edf3bufTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
T8b949e# Can't _easy_log this, as we'll recurse until we break
Tff7b72pass T8b949e# self._logger will pick this up, so we're fine
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_logger Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3level_std Tff7b72= Te6edf3LOGGING_LEVELTb4b4b4[Te6edf3levelTb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_loggerTff7b72.Td2a8fflogTb4b4b4(Te6edf3level_stdTb4b4b4, Te6edf3fmtTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)
Tff7b72def Td2a8ff_check_keepaliveTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_keepalive Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return
Te6edf3now Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Te6edf3last_msg_out Tff7b72= Tff7b72selfTff7b72.Td2a8ff_last_msg_out
Te6edf3last_msg_in Tff7b72= Tff7b72selfTff7b72.Td2a8ff_last_msg_in
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tb4b4b4(Te6edf3now Tff7b72- Te6edf3last_msg_out Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_keepalive Tff7b72or Te6edf3now Tff7b72- Te6edf3last_msg_in Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ff_keepaliveTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72== Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTED Tff7b72and Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_pingreqTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(
Te6edf3packet_from_brokerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3v1_rcTff7b72=Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_LOSTTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_msgtime_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_msg_out Tff7b72= Te6edf3now
Tff7b72selfTff7b72.Td2a8ff_last_msg_in Tff7b72= Te6edf3now
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_state Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTED
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_KEEPALIVE
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(
Te6edf3packet_from_brokerTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3v1_rcTff7b72=Te6edf3rcTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_mid_generateTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_mid_generate_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_mid Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_last_mid Tff7b72== T79c0ff65536Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_mid Tff7b72= T79c0ff1
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_last_mid
Tf0883e@staticmethod
Tff7b72def Td2a8ff_raise_for_invalid_topicTb4b4b4(Te6edf3topicTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e""" Check if the topic is a topic without wildcard and valid length.
Raise ValueError if the topic isn't valid.
"""
Tff7b72if Ta5d6ffbTa5d6ff'Ta5d6ff+Ta5d6ff' Tff7b72in Te6edf3topic Tff7b72or Ta5d6ffbTa5d6ff'Ta5d6ff#Ta5d6ff' Tff7b72in Te6edf3topicTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffPublish topic cannot contain wildcards.Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72> T79c0ff65535Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffPublish topic is too long.Ta5d6ff'Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ff_filter_wildcard_len_checkTb4b4b4(Te6edf3subTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3subTb4b4b4) Tff7b72== T79c0ff0 Tff7b72or Tffa657lenTb4b4b4(Te6edf3subTb4b4b4) Tff7b72> T79c0ff65535
Tff7b72or Tffa657anyTb4b4b4(Ta5d6ffbTa5d6ff'Ta5d6ff+Ta5d6ff' Tff7b72in Te6edf3p Tff7b72or Ta5d6ffbTa5d6ff'Ta5d6ff#Ta5d6ff' Tff7b72in Te6edf3p Tff7b72for Te6edf3p Tff7b72in Te6edf3subTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ffbTa5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4) Tff7b72if Tffa657lenTb4b4b4(Te6edf3pTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4)
Tff7b72or Ta5d6ffbTa5d6ff'Ta5d6ff#/Ta5d6ff' Tff7b72in Te6edf3subTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_INVAL
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_send_pingreqTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PINGREQTa5d6ff"Tb4b4b4)
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_simple_commandTb4b4b4(Te6edf3PINGREQTb4b4b4)
Tff7b72if Te6edf3rc Tff7b72== Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3rc
Tff7b72def Td2a8ff_send_pingrespTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PINGRESPTa5d6ff"Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_simple_commandTb4b4b4(Te6edf3PINGRESPTb4b4b4)
Tff7b72def Td2a8ff_send_pubackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PUBACK (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_command_with_midTb4b4b4(Te6edf3PUBACKTb4b4b4, Te6edf3midTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ff_send_pubcompTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PUBCOMP (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_command_with_midTb4b4b4(Te6edf3PUBCOMPTb4b4b4, Te6edf3midTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ff_pack_remaining_lengthTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4: Tffa657bytearrayTb4b4b4, Te6edf3remaining_lengthTb4b4b4: Tffa657int
Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytearrayTb4b4b4:
Te6edf3remaining_bytes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3byte Tff7b72= Te6edf3remaining_length Tff7b72% T79c0ff128
Te6edf3remaining_length Tff7b72= Te6edf3remaining_length Tff7b72/Tff7b72/ T79c0ff128
T8b949e# If there are more digits to encode, set the top bit of this digit
Tff7b72if Te6edf3remaining_length Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3byte Tff7b72|Tff7b72= T79c0ff0x80
Te6edf3remaining_bytesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3byteTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3byteTb4b4b4)
Tff7b72if Te6edf3remaining_length Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# FIXME - this doesn't deal with incorrectly large payloads
Tff7b72return Te6edf3packet
Tff7b72def Td2a8ff_pack_str16Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4: Tffa657bytearrayTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytes Tff7b72| Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3data Tff7b72= Te6edf3_force_bytesTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ff_send_publishTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3midTb4b4b4: Tffa657intTb4b4b4,
Te6edf3topicTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3payloadTb4b4b4: Tffa657bytesTff7b72|Tffa657bytearray Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3qosTb4b4b4: Tffa657int Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3retainTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3dupTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3infoTb4b4b4: Te6edf3MQTTMessageInfo Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e# we assume that topic and payload are already properly encoded
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3topicTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff'Ta5d6fftopic must be bytes, not strTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3payload Tff7b72and Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff'Ta5d6ffpayload must be bytes if setTa5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sock Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_NO_CONN
Te6edf3command Tff7b72= Te6edf3PUBLISH Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3dup Tff7b72& T79c0ff0x1Tb4b4b4) Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3qos Tff7b72<< T79c0ff1Tb4b4b4) Tff7b72| Te6edf3retain
Te6edf3packet Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3commandTb4b4b4)
Te6edf3payloadlen Tff7b72= Tffa657lenTb4b4b4(Te6edf3payloadTb4b4b4)
Te6edf3remaining_length Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72+ Te6edf3payloadlen
Tff7b72if Te6edf3payloadlen Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, properties=Tffd700%sTa5d6ff (NULL payload)Ta5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3retainTb4b4b4, Te6edf3midTb4b4b4, Te6edf3topicTb4b4b4, Te6edf3properties
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff (NULL payload)Ta5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3retainTb4b4b4, Te6edf3midTb4b4b4, Te6edf3topic
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, properties=Tffd700%sTa5d6ff, ... (Tffd700%dTa5d6ff bytes)Ta5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3retainTb4b4b4, Te6edf3midTb4b4b4, Te6edf3topicTb4b4b4, Te6edf3propertiesTb4b4b4, Te6edf3payloadlen
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, ... (Tffd700%dTa5d6ff bytes)Ta5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3retainTb4b4b4, Te6edf3midTb4b4b4, Te6edf3topicTb4b4b4, Te6edf3payloadlen
Tb4b4b4)
Tff7b72if Te6edf3qos Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# For message id
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3packed_properties Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3packed_properties Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_propertiesTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_remaining_lengthTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Te6edf3topicTb4b4b4)
Tff7b72if Te6edf3qos Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# For message id
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3packed_propertiesTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3PUBLISHTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3midTb4b4b4, Te6edf3qosTb4b4b4, Te6edf3infoTb4b4b4)
Tff7b72def Td2a8ff_send_pubrecTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PUBREC (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_command_with_midTb4b4b4(Te6edf3PUBRECTb4b4b4, Te6edf3midTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ff_send_pubrelTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending PUBREL (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_command_with_midTb4b4b4(Te6edf3PUBREL Tff7b72| T79c0ff2Tb4b4b4, Te6edf3midTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ff_send_command_with_midTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3commandTb4b4b4: Tffa657intTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4, Te6edf3dupTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e# For PUBACK, PUBCOMP, PUBREC, and PUBREL
Tff7b72if Te6edf3dupTb4b4b4:
Te6edf3command Tff7b72|Tff7b72= T79c0ff0x8
Te6edf3remaining_length Tff7b72= T79c0ff2
Te6edf3packet Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff'Ta5d6ff!BBHTa5d6ff'Tb4b4b4, Te6edf3commandTb4b4b4, Te6edf3remaining_lengthTb4b4b4, Te6edf3midTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3midTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff_send_simple_commandTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3commandTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e# For DISCONNECT, PINGREQ and PINGRESP
Te6edf3remaining_length Tff7b72= T79c0ff0
Te6edf3packet Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff'Ta5d6ff!BBTa5d6ff'Tb4b4b4, Te6edf3commandTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ff_send_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keepaliveTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Te6edf3proto_ver Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_protocolTb4b4b4)
T8b949e# hard-coded UTF-8 encoded string
Te6edf3protocol Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffMQTTTa5d6ff" Tff7b72if Te6edf3proto_ver Tff7b72>Tff7b72= Te6edf3MQTTv311 Tff7b72else Ta5d6ffbTa5d6ff"Ta5d6ffMQIsdpTa5d6ff"
Te6edf3remaining_length Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Te6edf3protocolTb4b4b4) Tff7b72+ T79c0ff1 Tff7b72+ \
T79c0ff1 Tff7b72+ T79c0ff2 Tff7b72+ T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_client_idTb4b4b4)
Te6edf3connect_flags Tff7b72= T79c0ff0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_clean_start Tff7b72is Tff7b72TrueTb4b4b4:
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x02
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_clean_start Tff7b72== Te6edf3MQTT_CLEAN_START_FIRST_ONLY Tff7b72and Tff7b72selfTff7b72.Td2a8ff_mqttv5_first_connectTb4b4b4:
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x02
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_clean_sessionTb4b4b4:
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x02
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_willTb4b4b4:
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2 Tff7b72+ \
Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_will_topicTb4b4b4) Tff7b72+ T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_will_payloadTb4b4b4)
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x04 Tff7b72| Tb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_will_qos Tff7b72& T79c0ff0x03Tb4b4b4) Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| Tb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_will_retain Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72<< T79c0ff5Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_username Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_usernameTb4b4b4)
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x80
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_password Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3connect_flags Tff7b72|Tff7b72= T79c0ff0x40
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_passwordTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_connect_properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3packed_connect_properties Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3packed_connect_properties Tff7b72= Tff7b72selfTff7b72.Td2a8ff_connect_propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_connect_propertiesTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_willTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_will_properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3packed_will_properties Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3packed_will_properties Tff7b72= Tff7b72selfTff7b72.Td2a8ff_will_propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_will_propertiesTb4b4b4)
Te6edf3command Tff7b72= Te6edf3CONNECT
Te6edf3packet Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3commandTb4b4b4)
T8b949e# as per the mosquitto broker, if the MSB of this version is set
T8b949e# to 1, then it treats the connection as a bridge
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_client_mode Tff7b72== Te6edf3MQTT_BRIDGETb4b4b4:
Te6edf3proto_ver Tff7b72|Tff7b72= T79c0ff0x80
Tff7b72selfTff7b72.Td2a8ff_pack_remaining_lengthTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff!HTffd700{Tffa657lenTb4b4b4(Te6edf3protocolTb4b4b4)Tffd700}Ta5d6ffsBBHTa5d6ff"Tb4b4b4,
Tffa657lenTb4b4b4(Te6edf3protocolTb4b4b4)Tb4b4b4, Te6edf3protocolTb4b4b4, Te6edf3proto_verTb4b4b4, Te6edf3connect_flagsTb4b4b4, Te6edf3keepaliveTb4b4b4,
Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3packed_connect_properties
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_client_idTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_willTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3packed_will_properties
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_will_topicTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_will_payloadTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_username Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_usernameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_password Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_passwordTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_keepalive Tff7b72= Te6edf3keepalive
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending CONNECT (uTffd700%dTa5d6ff, pTffd700%dTa5d6ff, wrTffd700%dTa5d6ff, wqTffd700%dTa5d6ff, wfTffd700%dTa5d6ff, cTffd700%dTa5d6ff, kTffd700%dTa5d6ff) client_id=Tffd700%sTa5d6ff properties=Tffd700%sTa5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x80Tb4b4b4) Tff7b72>> T79c0ff7Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x40Tb4b4b4) Tff7b72>> T79c0ff6Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x20Tb4b4b4) Tff7b72>> T79c0ff5Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x18Tb4b4b4) Tff7b72>> T79c0ff3Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x4Tb4b4b4) Tff7b72>> T79c0ff2Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x2Tb4b4b4) Tff7b72>> T79c0ff1Tb4b4b4,
Te6edf3keepaliveTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_client_idTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_connect_properties
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending CONNECT (uTffd700%dTa5d6ff, pTffd700%dTa5d6ff, wrTffd700%dTa5d6ff, wqTffd700%dTa5d6ff, wfTffd700%dTa5d6ff, cTffd700%dTa5d6ff, kTffd700%dTa5d6ff) client_id=Tffd700%sTa5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x80Tb4b4b4) Tff7b72>> T79c0ff7Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x40Tb4b4b4) Tff7b72>> T79c0ff6Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x20Tb4b4b4) Tff7b72>> T79c0ff5Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x18Tb4b4b4) Tff7b72>> T79c0ff3Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x4Tb4b4b4) Tff7b72>> T79c0ff2Tb4b4b4,
Tb4b4b4(Te6edf3connect_flags Tff7b72& T79c0ff0x2Tb4b4b4) Tff7b72>> T79c0ff1Tb4b4b4,
Te6edf3keepaliveTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_client_id
Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ff_send_disconnectTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3reasoncodeTb4b4b4: Te6edf3ReasonCode Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending DISCONNECT reasonCode=Tffd700%sTa5d6ff properties=Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3reasoncodeTb4b4b4,
Te6edf3properties
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffSending DISCONNECTTa5d6ff"Tb4b4b4)
Te6edf3remaining_length Tff7b72= T79c0ff0
Te6edf3command Tff7b72= Te6edf3DISCONNECT
Te6edf3packet Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3commandTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3properties Tff7b72is Tff7b72not Tff7b72None Tff7b72or Te6edf3reasoncode Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3reasoncode Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3reasoncode Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3DISCONNECT Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3identifierTff7b72=T79c0ff0Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3properties Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3packed_props Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_propsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_remaining_lengthTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3reasoncode Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3reasoncodeTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3properties Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3packed_props
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ff_send_subscribeTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3dupTb4b4b4: Tffa657intTb4b4b4,
Te6edf3topicsTb4b4b4: Te6edf3SequenceTb4b4b4[Tffa657tupleTb4b4b4[Tffa657bytesTb4b4b4, Te6edf3SubscribeOptions Tff7b72| Tffa657intTb4b4b4]Tb4b4b4]Tb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3MQTTErrorCodeTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
Te6edf3remaining_length Tff7b72= T79c0ff2
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3packed_subscribe_properties Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3packed_subscribe_properties Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_subscribe_propertiesTb4b4b4)
Tff7b72for Te6edf3tTb4b4b4, Te6edf3_ Tff7b72in Te6edf3topicsTb4b4b4:
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Te6edf3tTb4b4b4) Tff7b72+ T79c0ff1
Te6edf3command Tff7b72= Te6edf3SUBSCRIBE Tff7b72| Tb4b4b4(Te6edf3dup Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| T79c0ff0x2
Te6edf3packet Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3commandTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_remaining_lengthTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Te6edf3local_mid Tff7b72= Tff7b72selfTff7b72.Td2a8ff_mid_generateTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3local_midTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3packed_subscribe_properties
Tff7b72for Te6edf3tTb4b4b4, Te6edf3q Tff7b72in Te6edf3topicsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Te6edf3tTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3qTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4) T8b949e# type: ignore
Tff7b72elseTb4b4b4:
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3qTb4b4b4) T8b949e# type: ignore
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending SUBSCRIBE (dTffd700%dTa5d6ff, mTffd700%dTa5d6ff) Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4,
Te6edf3local_midTb4b4b4,
Te6edf3topicsTb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3local_midTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3local_midTb4b4b4)
Tff7b72def Td2a8ff_send_unsubscribeTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3dupTb4b4b4: Tffa657intTb4b4b4,
Te6edf3topicsTb4b4b4: Tffa657listTb4b4b4[Tffa657bytesTb4b4b4]Tb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Te6edf3MQTTErrorCodeTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
Te6edf3remaining_length Tff7b72= T79c0ff2
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3packed_unsubscribe_properties Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'
Tff7b72elseTb4b4b4:
Te6edf3packed_unsubscribe_properties Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3remaining_length Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_unsubscribe_propertiesTb4b4b4)
Tff7b72for Te6edf3t Tff7b72in Te6edf3topicsTb4b4b4:
Te6edf3remaining_length Tff7b72+Tff7b72= T79c0ff2 Tff7b72+ Tffa657lenTb4b4b4(Te6edf3tTb4b4b4)
Te6edf3command Tff7b72= Te6edf3UNSUBSCRIBE Tff7b72| Tb4b4b4(Te6edf3dup Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| T79c0ff0x2
Te6edf3packet Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3commandTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pack_remaining_lengthTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3remaining_lengthTb4b4b4)
Te6edf3local_mid Tff7b72= Tff7b72selfTff7b72.Td2a8ff_mid_generateTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72.Td2a8ffextendTb4b4b4(Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3local_midTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72+Tff7b72= Te6edf3packed_unsubscribe_properties
Tff7b72for Te6edf3t Tff7b72in Te6edf3topicsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pack_str16Tb4b4b4(Te6edf3packetTb4b4b4, Te6edf3tTb4b4b4)
T8b949e# topics_repr = ", ".join("'"+topic.decode('utf8')+"'" for topic in topics)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending UNSUBSCRIBE (dTffd700%dTa5d6ff, mTffd700%dTa5d6ff) Tffd700%sTa5d6ff Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4,
Te6edf3local_midTb4b4b4,
Te6edf3propertiesTb4b4b4,
Te6edf3topicsTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffSending UNSUBSCRIBE (dTffd700%dTa5d6ff, mTffd700%dTa5d6ff) Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3dupTb4b4b4,
Te6edf3local_midTb4b4b4,
Te6edf3topicsTb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_packet_queueTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3local_midTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3local_midTb4b4b4)
Tff7b72def Td2a8ff_check_clean_sessionTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_clean_start Tff7b72== Te6edf3MQTT_CLEAN_START_FIRST_ONLYTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_mqttv5_first_connect
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_clean_start T8b949e# type: ignore
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_clean_session
Tff7b72def Td2a8ff_messages_reconnect_reset_outTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72= T79c0ff0
Tff7b72for Te6edf3m Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff0
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72== T79c0ff0 Tff7b72or Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72< Tff7b72selfTff7b72.Td2a8ff_max_inflight_messagesTb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_publish
Tff7b72elif Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# self._inflight_messages = self._inflight_messages + 1
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_wait_for_pubackTb4b4b4:
Te6edf3mTff7b72.Td2a8ffdup Tff7b72= Tff7b72True
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_publish
Tff7b72elif Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff2Tb4b4b4:
T8b949e# self._inflight_messages = self._inflight_messages + 1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_check_clean_sessionTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72!= Te6edf3mqtt_ms_publishTb4b4b4:
Te6edf3mTff7b72.Td2a8ffdup Tff7b72= Tff7b72True
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_publish
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_wait_for_pubcompTb4b4b4:
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_resend_pubrel
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_wait_for_pubrecTb4b4b4:
Te6edf3mTff7b72.Td2a8ffdup Tff7b72= Tff7b72True
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_publish
Tff7b72elseTb4b4b4:
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_queued
Tff7b72def Td2a8ff_messages_reconnect_reset_inTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_message_mutexTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_check_clean_sessionTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_in_messages Tff7b72= Te6edf3collectionsTff7b72.Td2a8ffOrderedDictTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72for Te6edf3m Tff7b72in Tff7b72selfTff7b72.Td2a8ff_in_messagesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mTff7b72.Td2a8fftimestamp Tff7b72= T79c0ff0
Tff7b72if Te6edf3mTff7b72.Td2a8ffqos Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_in_messagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3mTff7b72.Td2a8ffmidTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Preserve current state
Tff7b72pass
Tff7b72def Td2a8ff_messages_reconnect_resetTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_messages_reconnect_reset_outTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_messages_reconnect_reset_inTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_packet_queueTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3commandTb4b4b4: Tffa657intTb4b4b4,
Te6edf3packetTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3midTb4b4b4: Tffa657intTb4b4b4,
Te6edf3qosTb4b4b4: Tffa657intTb4b4b4,
Te6edf3infoTb4b4b4: Te6edf3MQTTMessageInfo Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Te6edf3mpktTb4b4b4: Te6edf3_OutPacket Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcommandTa5d6ff"Tb4b4b4: Te6edf3commandTb4b4b4,
Ta5d6ff"Ta5d6ffmidTa5d6ff"Tb4b4b4: Te6edf3midTb4b4b4,
Ta5d6ff"Ta5d6ffqosTa5d6ff"Tb4b4b4: Te6edf3qosTb4b4b4,
Ta5d6ff"Ta5d6ffposTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffto_processTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpacketTa5d6ff"Tb4b4b4: Te6edf3packetTb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4: Te6edf3infoTb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_out_packetTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mpktTb4b4b4)
T8b949e# Write a single byte to sockpairW (connected to sockpairR) to break
T8b949e# out of select() if in threaded mode.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sockpairW Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sockpairWTff7b72.Td2a8ffsendTb4b4b4(Te6edf3sockpair_dataTb4b4b4)
Tff7b72except Tf85149BlockingIOErrorTb4b4b4:
Tff7b72pass
T8b949e# If we have an external event loop registered, use that instead
T8b949e# of calling loop_write() directly.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72is Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ff_on_socket_register_write Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTff7b72.Td2a8ffacquireTb4b4b4(Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffloop_writeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_call_socket_register_writeTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_packet_handleTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Te6edf3cmd Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4] Tff7b72& T79c0ff0xF0
Tff7b72if Te6edf3cmd Tff7b72== Te6edf3PINGREQTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pingreqTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PINGRESPTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pingrespTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PUBACKTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pubackcompTb4b4b4(Ta5d6ff"Ta5d6ffPUBACKTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PUBCOMPTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pubackcompTb4b4b4(Ta5d6ff"Ta5d6ffPUBCOMPTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PUBLISHTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_publishTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PUBRECTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pubrecTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3PUBRELTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_pubrelTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3CONNACKTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_connackTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3SUBACKTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_subackTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3UNSUBACKTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_handle_unsubackTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3cmd Tff7b72== Te6edf3DISCONNECT Tff7b72and Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4: T8b949e# only allowed in MQTT 5.0
Tff7b72selfTff7b72.Td2a8ff_handle_disconnectTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
T8b949e# If we don't recognise the command, return an error straight away.
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff"Ta5d6ffError: Unrecognised command Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3cmdTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72def Td2a8ff_handle_pingreqTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived PINGREQTa5d6ff"Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pingrespTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_handle_pingrespTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
T8b949e# No longer waiting for a PINGRESP.
Tff7b72selfTff7b72.Td2a8ff_ping_t Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived PINGRESPTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_handle_connackTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72< T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tb4b4b4(Te6edf3flagsTb4b4b4, Te6edf3resultTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(
Ta5d6ff"Ta5d6ff!BBTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3result Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# This is probably a failure from a broker that doesn't support
T8b949e# MQTT v5.
Te6edf3reason Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3CONNACK Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3aNameTff7b72=Ta5d6ff"Ta5d6ffUnsupported protocol versionTa5d6ff"Tb4b4b4)
Te6edf3properties Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3reason Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3CONNACK Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3identifierTff7b72=Te6edf3resultTb4b4b4)
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3CONNACK Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tb4b4b4(Te6edf3flagsTb4b4b4, Te6edf3resultTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!BBTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4)
Te6edf3reason Tff7b72= Te6edf3convert_connack_rc_to_reason_codeTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3properties Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv311Tb4b4b4:
Tff7b72if Te6edf3result Tff7b72== Te6edf3CONNACK_REFUSED_PROTOCOL_VERSIONTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_reconnect_on_failureTb4b4b4:
Tff7b72return Te6edf3MQTT_ERR_PROTOCOL
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffReceived CONNACK (Tffd700%sTa5d6ff, Tffd700%sTa5d6ff), attempting downgrade to MQTT v3.1.Ta5d6ff"Tb4b4b4,
Te6edf3flagsTb4b4b4, Te6edf3result
Tb4b4b4)
T8b949e# Downgrade to MQTT v3.1
Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72= Te6edf3MQTTv31
Tff7b72return Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elif Tb4b4b4(Te6edf3result Tff7b72== Te6edf3CONNACK_REFUSED_IDENTIFIER_REJECTED
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_client_id Tff7b72== Ta5d6ffbTa5d6ff'Ta5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_reconnect_on_failureTb4b4b4:
Tff7b72return Te6edf3MQTT_ERR_PROTOCOL
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffReceived CONNACK (Tffd700%sTa5d6ff, Tffd700%sTa5d6ff), attempting to use non-empty CIDTa5d6ff"Tb4b4b4,
Te6edf3flagsTb4b4b4, Te6edf3resultTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_client_id Tff7b72= Te6edf3_base62Tb4b4b4(Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffintTb4b4b4, Te6edf3paddingTff7b72=T79c0ff22Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf8Ta5d6ff"Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3result Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_CONNECTED
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived CONNACK (Tffd700%sTa5d6ff, Tffd700%sTa5d6ff) properties=Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3flagsTb4b4b4, Te6edf3reasonTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived CONNACK (Tffd700%sTa5d6ff, Tffd700%sTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3flagsTb4b4b4, Te6edf3resultTb4b4b4)
T8b949e# it won't be the first successful connect any more
Tff7b72selfTff7b72.Td2a8ff_mqttv5_first_connect Tff7b72= Tff7b72False
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_connect Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_connect
Tff7b72if Te6edf3on_connectTb4b4b4:
Te6edf3flags_dict Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3flags_dictTb4b4b4[Ta5d6ff'Ta5d6ffsession presentTa5d6ff'Tb4b4b4] Tff7b72= Te6edf3flags Tff7b72& T79c0ff0x01
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3on_connect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnConnect_v1_mqtt5Tb4b4b4, Te6edf3on_connectTb4b4b4)
Te6edf3on_connectTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3flags_dictTb4b4b4, Te6edf3reasonTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3on_connect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnConnect_v1_mqtt3Tb4b4b4, Te6edf3on_connectTb4b4b4)
Te6edf3on_connectTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3flags_dictTb4b4b4, Te6edf3resultTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_connect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnConnect_v2Tb4b4b4, Te6edf3on_connectTb4b4b4)
Te6edf3connect_flags Tff7b72= Te6edf3ConnectFlagsTb4b4b4(
Te6edf3session_presentTff7b72=Te6edf3flags_dictTb4b4b4[Ta5d6ff'Ta5d6ffsession presentTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff0
Tb4b4b4)
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4)
Te6edf3on_connectTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3connect_flagsTb4b4b4,
Te6edf3reasonTb4b4b4,
Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_connect: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72if Te6edf3result Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3rc Tff7b72= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Tff7b72for Te6edf3m Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3mTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_queuedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloop_writeTb4b4b4(Tb4b4b4) T8b949e# Process outgoing messages that have just been queued up
Tff7b72return Te6edf3MQTT_ERR_SUCCESS
Tff7b72if Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4: T8b949e# Don't call loop_write after _send_publish()
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(
Te6edf3mTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3mTff7b72.Td2a8fftopicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4,
Te6edf3mTff7b72.Td2a8ffpayloadTb4b4b4,
Te6edf3mTff7b72.Td2a8ffqosTb4b4b4,
Te6edf3mTff7b72.Td2a8ffretainTb4b4b4,
Te6edf3mTff7b72.Td2a8ffdupTb4b4b4,
Te6edf3propertiesTff7b72=Te6edf3mTff7b72.Td2a8ffproperties
Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72elif Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_publishTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72+Tff7b72= T79c0ff1
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_puback
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4: T8b949e# Don't call loop_write after _send_publish()
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(
Te6edf3mTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3mTff7b72.Td2a8fftopicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4,
Te6edf3mTff7b72.Td2a8ffpayloadTb4b4b4,
Te6edf3mTff7b72.Td2a8ffqosTb4b4b4,
Te6edf3mTff7b72.Td2a8ffretainTb4b4b4,
Te6edf3mTff7b72.Td2a8ffdupTb4b4b4,
Te6edf3propertiesTff7b72=Te6edf3mTff7b72.Td2a8ffproperties
Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72elif Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_publishTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72+Tff7b72= T79c0ff1
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubrec
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4: T8b949e# Don't call loop_write after _send_publish()
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(
Te6edf3mTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3mTff7b72.Td2a8fftopicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4,
Te6edf3mTff7b72.Td2a8ffpayloadTb4b4b4,
Te6edf3mTff7b72.Td2a8ffqosTb4b4b4,
Te6edf3mTff7b72.Td2a8ffretainTb4b4b4,
Te6edf3mTff7b72.Td2a8ffdupTb4b4b4,
Te6edf3propertiesTff7b72=Te6edf3mTff7b72.Td2a8ffproperties
Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72elif Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_resend_pubrelTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72+Tff7b72= T79c0ff1
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubcomp
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4: T8b949e# Don't call loop_write after _send_publish()
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_pubrelTb4b4b4(Te6edf3mTff7b72.Td2a8ffmidTb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72selfTff7b72.Td2a8ffloop_writeTb4b4b4(Tb4b4b4) T8b949e# Process outgoing messages that have just been queued up
Tff7b72return Te6edf3rc
Tff7b72elif Te6edf3result Tff7b72> T79c0ff0 Tff7b72and Te6edf3result Tff7b72< T79c0ff6Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_CONN_REFUSED
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72def Td2a8ff_handle_disconnectTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3packet_type Tff7b72= Te6edf3DISCONNECT Tff7b72>> T79c0ff4
Te6edf3reasonCode Tff7b72= Te6edf3properties Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff2Tb4b4b4:
Te6edf3reasonCode Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3packet_typeTb4b4b4)
Te6edf3reasonCodeTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3packet_typeTb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived DISCONNECT Tffd700%sTa5d6ff Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3reasonCodeTb4b4b4,
Te6edf3properties
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sock_closeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_do_on_disconnectTb4b4b4(
Te6edf3packet_from_brokerTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3v1_rcTff7b72=Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4, T8b949e# If reason is absent (remaining length < 1), it means normal disconnection
Te6edf3reasonTff7b72=Te6edf3reasonCodeTb4b4b4,
Te6edf3propertiesTff7b72=Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_handle_subackTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived SUBACKTa5d6ff"Tb4b4b4)
Te6edf3pack_format Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff!HTffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72- T79c0ff2Tffd700}Ta5d6ffsTa5d6ff"
Tb4b4b4(Te6edf3midTb4b4b4, Te6edf3packetTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3pack_formatTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3SUBACK Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3reasoncodes Tff7b72= Tb4b4b4[Te6edf3ReasonCodeTb4b4b4(Te6edf3SUBACK Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3identifierTff7b72=Te6edf3cTb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3packetTb4b4b4[Te6edf3props_lenTb4b4b4:Tb4b4b4]Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3pack_format Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff!Tffd700{Ta5d6ff'Ta5d6ffBTa5d6ff' Tff7b72* Tffa657lenTb4b4b4(Te6edf3packetTb4b4b4)Tffd700}Ta5d6ff"
Te6edf3granted_qos Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3pack_formatTb4b4b4, Te6edf3packetTb4b4b4)
Te6edf3reasoncodes Tff7b72= Tb4b4b4[Te6edf3ReasonCodeTb4b4b4(Te6edf3SUBACK Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3identifierTff7b72=Te6edf3cTb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3granted_qosTb4b4b4]
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3SUBACK Tff7b72>> T79c0ff4Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_subscribe Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_subscribe
Tff7b72if Te6edf3on_subscribeTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4: T8b949e# Don't call loop_write after _send_publish()
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3on_subscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnSubscribe_v1_mqtt5Tb4b4b4, Te6edf3on_subscribeTb4b4b4)
Te6edf3on_subscribeTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3midTb4b4b4, Te6edf3reasoncodesTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3on_subscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnSubscribe_v1_mqtt3Tb4b4b4, Te6edf3on_subscribeTb4b4b4)
Te6edf3on_subscribeTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3midTb4b4b4, Te6edf3granted_qosTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_subscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnSubscribe_v2Tb4b4b4, Te6edf3on_subscribeTb4b4b4)
Te6edf3on_subscribeTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3midTb4b4b4,
Te6edf3reasoncodesTb4b4b4,
Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_subscribe: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72def Td2a8ff_handle_publishTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Te6edf3header Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffcommandTa5d6ff'Tb4b4b4]
Te6edf3message Tff7b72= Te6edf3MQTTMessageTb4b4b4(Tb4b4b4)
Te6edf3messageTff7b72.Td2a8ffdup Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3header Tff7b72& T79c0ff0x08Tb4b4b4) Tff7b72>> T79c0ff3Tb4b4b4) Tff7b72!= T79c0ff0
Te6edf3messageTff7b72.Td2a8ffqos Tff7b72= Tb4b4b4(Te6edf3header Tff7b72& T79c0ff0x06Tb4b4b4) Tff7b72>> T79c0ff1
Te6edf3messageTff7b72.Td2a8ffretain Tff7b72= Tb4b4b4(Te6edf3header Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72!= T79c0ff0
Te6edf3pack_format Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff!HTffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72- T79c0ff2Tffd700}Ta5d6ffsTa5d6ff"
Tb4b4b4(Te6edf3slenTb4b4b4, Te6edf3packetTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3pack_formatTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4)
Te6edf3pack_format Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff!Tffd700{Te6edf3slenTffd700}Ta5d6ffsTffd700{Tffa657lenTb4b4b4(Te6edf3packetTb4b4b4) Tff7b72- Te6edf3slenTffd700}Ta5d6ffsTa5d6ff"
Tb4b4b4(Te6edf3topicTb4b4b4, Te6edf3packetTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3pack_formatTb4b4b4, Te6edf3packetTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72!= Te6edf3MQTTv5 Tff7b72and Tffa657lenTb4b4b4(Te6edf3topicTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
T8b949e# Handle topics with invalid UTF-8
T8b949e# This replaces an invalid topic with a message and the hex
T8b949e# representation of the topic for logging. When the user attempts to
T8b949e# access message.topic in the callback, an exception will be raised.
Tff7b72tryTb4b4b4:
Te6edf3print_topic Tff7b72= Te6edf3topicTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72except Tf85149UnicodeDecodeErrorTb4b4b4:
Te6edf3print_topic Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffTOPIC WITH INVALID UTF-8: Tffd700{Te6edf3topicTffd700!r}Ta5d6ff"
Te6edf3messageTff7b72.Td2a8fftopic Tff7b72= Te6edf3topic
Tff7b72if Te6edf3messageTff7b72.Td2a8ffqos Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3pack_format Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff!HTffd700{Tffa657lenTb4b4b4(Te6edf3packetTb4b4b4) Tff7b72- T79c0ff2Tffd700}Ta5d6ffsTa5d6ff"
Tb4b4b4(Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4, Te6edf3packetTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3pack_formatTb4b4b4, Te6edf3packetTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffproperties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PUBLISH Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3messageTff7b72.Td2a8ffpropertiesTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4[Te6edf3props_lenTb4b4b4:Tb4b4b4]
Te6edf3messageTff7b72.Td2a8ffpayload Tff7b72= Te6edf3packet
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffReceived PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, properties=Tffd700%sTa5d6ff, ... (Tffd700%dTa5d6ff bytes)Ta5d6ff"Tb4b4b4,
Te6edf3messageTff7b72.Td2a8ffdupTb4b4b4, Te6edf3messageTff7b72.Td2a8ffqosTb4b4b4, Te6edf3messageTff7b72.Td2a8ffretainTb4b4b4, Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3print_topicTb4b4b4, Te6edf3messageTff7b72.Td2a8ffpropertiesTb4b4b4, Tffa657lenTb4b4b4(Te6edf3messageTff7b72.Td2a8ffpayloadTb4b4b4)
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_DEBUGTb4b4b4,
Ta5d6ff"Ta5d6ffReceived PUBLISH (dTffd700%dTa5d6ff, qTffd700%dTa5d6ff, rTffd700%dTa5d6ff, mTffd700%dTa5d6ff), Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, ... (Tffd700%dTa5d6ff bytes)Ta5d6ff"Tb4b4b4,
Te6edf3messageTff7b72.Td2a8ffdupTb4b4b4, Te6edf3messageTff7b72.Td2a8ffqosTb4b4b4, Te6edf3messageTff7b72.Td2a8ffretainTb4b4b4, Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3print_topicTb4b4b4, Tffa657lenTb4b4b4(Te6edf3messageTff7b72.Td2a8ffpayloadTb4b4b4)
Tb4b4b4)
Te6edf3messageTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3messageTff7b72.Td2a8ffqos Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_on_messageTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elif Te6edf3messageTff7b72.Td2a8ffqos Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_on_messageTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_manual_ackTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pubackTb4b4b4(Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4)
Tff7b72elif Te6edf3messageTff7b72.Td2a8ffqos Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_pubrecTb4b4b4(Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubrel
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_message_mutexTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_in_messagesTb4b4b4[Te6edf3messageTff7b72.Td2a8ffmidTb4b4b4] Tff7b72= Te6edf3message
Tff7b72return Te6edf3rc
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72def Td2a8ffackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4, Te6edf3qosTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e"""
send an acknowledgement for a given message id (stored in :py:attr:`message.mid <MQTTMessage.mid>`).
only useful in QoS>=1 and ``manual_ack=True`` (option of `Client`)
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_manual_ack Tb4b4b4:
Tff7b72if Te6edf3qos Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pubackTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72elif Te6edf3qos Tff7b72== T79c0ff2Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pubcompTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ffmanual_ack_setTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3onTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""
The paho library normally acknowledges messages as soon as they are delivered to the caller.
If manual_ack is turned on, then the caller MUST manually acknowledge every message once
application processing is complete using `ack()`
"""
Tff7b72selfTff7b72.Td2a8ff_manual_ack Tff7b72= Te6edf3on
Tff7b72def Td2a8ff_handle_pubrelTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72< T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Te6edf3midTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff2Tb4b4b4:
Te6edf3reasonCode Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3PUBREL Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3reasonCodeTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PUBREL Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived PUBREL (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_message_mutexTb4b4b4:
Tff7b72if Te6edf3mid Tff7b72in Tff7b72selfTff7b72.Td2a8ff_in_messagesTb4b4b4:
T8b949e# Only pass the message on if we have removed it from the queue - this
T8b949e# prevents multiple callbacks for the same message.
Te6edf3message Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_messagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_handle_on_messageTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_update_inflightTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
T8b949e# FIXME: this should only be done if the message is known
T8b949e# If unknown it's a protocol error and we should close the connection.
T8b949e# But since we don't have (on disk) persistence for the session, it
T8b949e# is possible that we must known about this message.
T8b949e# Choose to acknowledge this message (thus losing a message) but
T8b949e# avoid hanging. See #284.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_manual_ackTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pubcompTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72def Td2a8ff_update_inflightTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
T8b949e# Dont lock message_mutex here
Tff7b72for Te6edf3m Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72< Tff7b72selfTff7b72.Td2a8ff_max_inflight_messagesTb4b4b4:
Tff7b72if Te6edf3mTff7b72.Td2a8ffqos Tff7b72> T79c0ff0 Tff7b72and Te6edf3mTff7b72.Td2a8ffstate Tff7b72== Te6edf3mqtt_ms_queuedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_puback
Tff7b72elif Te6edf3mTff7b72.Td2a8ffqos Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3mTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubrec
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_send_publishTb4b4b4(
Te6edf3mTff7b72.Td2a8ffmidTb4b4b4,
Te6edf3mTff7b72.Td2a8fftopicTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4,
Te6edf3mTff7b72.Td2a8ffpayloadTb4b4b4,
Te6edf3mTff7b72.Td2a8ffqosTb4b4b4,
Te6edf3mTff7b72.Td2a8ffretainTb4b4b4,
Te6edf3mTff7b72.Td2a8ffdupTb4b4b4,
Te6edf3propertiesTff7b72=Te6edf3mTff7b72.Td2a8ffpropertiesTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_handle_pubrecTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72< T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Te6edf3midTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff2Tb4b4b4:
Te6edf3reasonCode Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3PUBREC Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3reasonCodeTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PUBREC Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived PUBREC (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Tff7b72if Te6edf3mid Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4:
Te6edf3msg Tff7b72= Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4[Te6edf3midTb4b4b4]
Te6edf3msgTff7b72.Td2a8ffstate Tff7b72= Te6edf3mqtt_ms_wait_for_pubcomp
Te6edf3msgTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_pubrelTb4b4b4(Te6edf3midTb4b4b4)
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_handle_unsubackTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72< T79c0ff4Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Te6edf3midTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3packet Tff7b72= Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3UNSUBACK Tff7b72>> T79c0ff4Tb4b4b4)
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3reasoncodes_list Tff7b72= Tb4b4b4[
Te6edf3ReasonCodeTb4b4b4(Te6edf3UNSUBACK Tff7b72>> T79c0ff4Tb4b4b4, Te6edf3identifierTff7b72=Te6edf3cTb4b4b4)
Tff7b72for Te6edf3c Tff7b72in Te6edf3packetTb4b4b4[Te6edf3props_lenTb4b4b4:Tb4b4b4]
Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3reasoncodes_list Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3UNSUBACK Tff7b72>> T79c0ff4Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived UNSUBACK (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3midTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_unsubscribe Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_unsubscribe
Tff7b72if Te6edf3on_unsubscribeTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3on_unsubscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnUnsubscribe_v1_mqtt5Tb4b4b4, Te6edf3on_unsubscribeTb4b4b4)
Te6edf3reasoncodesTb4b4b4: Te6edf3ReasonCode Tff7b72| Tffa657listTb4b4b4[Te6edf3ReasonCodeTb4b4b4] Tff7b72= Te6edf3reasoncodes_list
Tff7b72if Tffa657lenTb4b4b4(Te6edf3reasoncodes_listTb4b4b4) Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3reasoncodes Tff7b72= Te6edf3reasoncodes_listTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3on_unsubscribeTb4b4b4(
Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3midTb4b4b4, Te6edf3propertiesTb4b4b4, Te6edf3reasoncodesTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3on_unsubscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnUnsubscribe_v1_mqtt3Tb4b4b4, Te6edf3on_unsubscribeTb4b4b4)
Te6edf3on_unsubscribeTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3midTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_unsubscribe Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnUnsubscribe_v2Tb4b4b4, Te6edf3on_unsubscribeTb4b4b4)
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffCONNACKTb4b4b4)
Te6edf3on_unsubscribeTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3midTb4b4b4,
Te6edf3reasoncodes_listTb4b4b4,
Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_unsubscribe: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_do_on_disconnectTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3packet_from_brokerTb4b4b4: Tffa657boolTb4b4b4,
Te6edf3v1_rcTb4b4b4: Te6edf3MQTTErrorCodeTb4b4b4,
Te6edf3reasonTb4b4b4: Te6edf3ReasonCode Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3propertiesTb4b4b4: Te6edf3Properties Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_disconnect Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_disconnect
Tff7b72if Te6edf3on_disconnectTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Te6edf3on_disconnect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnDisconnect_v1_mqtt5Tb4b4b4, Te6edf3on_disconnectTb4b4b4)
Tff7b72if Te6edf3packet_from_brokerTb4b4b4:
Te6edf3on_disconnectTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3reasonTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3on_disconnectTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3v1_rcTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3on_disconnect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnDisconnect_v1_mqtt3Tb4b4b4, Te6edf3on_disconnectTb4b4b4)
Te6edf3on_disconnectTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3v1_rcTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_disconnect Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnDisconnect_v2Tb4b4b4, Te6edf3on_disconnectTb4b4b4)
Te6edf3disconnect_flags Tff7b72= Te6edf3DisconnectFlagsTb4b4b4(
Te6edf3is_disconnect_packet_from_serverTff7b72=Te6edf3packet_from_broker
Tb4b4b4)
Tff7b72if Te6edf3reason Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3reason Tff7b72= Te6edf3convert_disconnect_error_code_to_reason_codeTb4b4b4(Te6edf3v1_rcTb4b4b4)
Tff7b72if Te6edf3properties Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3PacketTypesTff7b72.Td2a8ffDISCONNECTTb4b4b4)
Te6edf3on_disconnectTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3disconnect_flagsTb4b4b4,
Te6edf3reasonTb4b4b4,
Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_disconnect: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72def Td2a8ff_do_on_publishTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3midTb4b4b4: Tffa657intTb4b4b4, Te6edf3reason_codeTb4b4b4: Te6edf3ReasonCodeTb4b4b4, Te6edf3propertiesTb4b4b4: Te6edf3PropertiesTb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_publish Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_publish
Tff7b72if Te6edf3on_publishTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION1Tb4b4b4:
Te6edf3on_publish Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnPublish_v1Tb4b4b4, Te6edf3on_publishTb4b4b4)
Te6edf3on_publishTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3midTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_callback_api_version Tff7b72== Te6edf3CallbackAPIVersionTff7b72.Td2a8ffVERSION2Tb4b4b4:
Te6edf3on_publish Tff7b72= Te6edf3castTb4b4b4(Te6edf3CallbackOnPublish_v2Tb4b4b4, Te6edf3on_publishTb4b4b4)
Te6edf3on_publishTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4,
Te6edf3midTb4b4b4,
Te6edf3reason_codeTb4b4b4,
Te6edf3propertiesTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported callback API versionTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_publish: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Te6edf3msg Tff7b72= Tff7b72selfTff7b72.Td2a8ff_out_messagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3midTb4b4b4)
Te6edf3msgTff7b72.Td2a8ffinfoTff7b72.Td2a8ff_set_as_publishedTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3msgTff7b72.Td2a8ffqos Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_inflight_messages Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_max_inflight_messages Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_update_inflightTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rc Tff7b72!= Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESSTb4b4b4:
Tff7b72return Te6edf3rc
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_handle_pubackcompTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3cmdTb4b4b4: Te6edf3LiteralTb4b4b4[Ta5d6ff'Ta5d6ffPUBACKTa5d6ff'Tb4b4b4] Tff7b72| Te6edf3LiteralTb4b4b4[Ta5d6ff'Ta5d6ffPUBCOMPTa5d6ff'Tb4b4b4]
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3MQTTErrorCodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72< T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_PROTOCOL
Te6edf3packet_type_enum Tff7b72= Te6edf3PUBACK Tff7b72if Te6edf3cmd Tff7b72== Ta5d6ff"Ta5d6ffPUBACKTa5d6ff" Tff7b72else Te6edf3PUBCOMP
Te6edf3packet_type Tff7b72= Te6edf3packet_type_enumTff7b72.Td2a8ffvalue Tff7b72>> T79c0ff4
Te6edf3midTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4)
Te6edf3reasonCode Tff7b72= Te6edf3ReasonCodeTb4b4b4(Te6edf3packet_typeTb4b4b4)
Te6edf3properties Tff7b72= Te6edf3PropertiesTb4b4b4(Te6edf3packet_typeTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_protocol Tff7b72== Te6edf3MQTTv5Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff2Tb4b4b4:
Te6edf3reasonCodeTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffremaining_lengthTa5d6ff'Tb4b4b4] Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3propsTb4b4b4, Te6edf3props_len Tff7b72= Te6edf3propertiesTff7b72.Td2a8ffunpackTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_in_packetTb4b4b4[Ta5d6ff'Ta5d6ffpacketTa5d6ff'Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(Te6edf3MQTT_LOG_DEBUGTb4b4b4, Ta5d6ff"Ta5d6ffReceived Tffd700%sTa5d6ff (Mid: Tffd700%dTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3cmdTb4b4b4, Te6edf3midTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_out_message_mutexTb4b4b4:
Tff7b72if Te6edf3mid Tff7b72in Tff7b72selfTff7b72.Td2a8ff_out_messagesTb4b4b4:
T8b949e# Only inform the client the message has been sent once.
Te6edf3rc Tff7b72= Tff7b72selfTff7b72.Td2a8ff_do_on_publishTb4b4b4(Te6edf3midTb4b4b4, Te6edf3reasonCodeTb4b4b4, Te6edf3propertiesTb4b4b4)
Tff7b72return Te6edf3rc
Tff7b72return Te6edf3MQTTErrorCodeTff7b72.Td2a8ffMQTT_ERR_SUCCESS
Tff7b72def Td2a8ff_handle_on_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4: Te6edf3MQTTMessageTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3topic Tff7b72= Te6edf3messageTff7b72.Td2a8fftopic
Tff7b72except Tf85149UnicodeDecodeErrorTb4b4b4:
Te6edf3topic Tff7b72= Tff7b72None
Te6edf3on_message_callbacks Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Tff7b72if Te6edf3topic Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3on_message_callbacks Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_message_filteredTff7b72.Td2a8ffiter_matchTb4b4b4(Te6edf3messageTff7b72.Td2a8fftopicTb4b4b4)Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3on_message_callbacksTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3on_message Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_message
Tff7b72elseTb4b4b4:
Te6edf3on_message Tff7b72= Tff7b72None
Tff7b72for Te6edf3callback Tff7b72in Te6edf3on_message_callbacksTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3callbackTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3messageTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4,
Ta5d6ff'Ta5d6ffCaught exception in user defined callback function Tffd700%sTa5d6ff: Tffd700%sTa5d6ff'Tb4b4b4,
Te6edf3callbackTff7b72.Td2a8ff__name__Tb4b4b4,
Te6edf3err
Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72if Te6edf3on_messageTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_messageTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4, Te6edf3messageTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_message: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsuppress_exceptionsTb4b4b4:
Tff7b72raise
Tff7b72def Td2a8ff_handle_on_connect_failTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_callback_mutexTb4b4b4:
Te6edf3on_connect_fail Tff7b72= Tff7b72selfTff7b72.Td2a8ffon_connect_fail
Tff7b72if Te6edf3on_connect_failTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_in_callback_mutexTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3on_connect_failTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_userdataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3errTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_easy_logTb4b4b4(
Te6edf3MQTT_LOG_ERRTb4b4b4, Ta5d6ff'Ta5d6ffCaught exception in on_connect_fail: Tffd700%sTa5d6ff'Tb4b4b4, Te6edf3errTb4b4b4)
Tff7b72def Td2a8ff_thread_mainTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloop_foreverTb4b4b4(Te6edf3retry_first_connectionTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_thread Tff7b72= Tff7b72None
Tff7b72def Td2a8ff_reconnect_waitTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e# See reconnect_delay_set for details
Te6edf3now Tff7b72= Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_reconnect_delay_mutexTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72= Tff7b72selfTff7b72.Td2a8ff_reconnect_min_delay
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72= Tffa657minTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_reconnect_delay Tff7b72* T79c0ff2Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_reconnect_max_delayTb4b4b4,
Tb4b4b4)
Te6edf3target_time Tff7b72= Te6edf3now Tff7b72+ Tff7b72selfTff7b72.Td2a8ff_reconnect_delay
Te6edf3remaining Tff7b72= Te6edf3target_time Tff7b72- Te6edf3now
Tff7b72while Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_state Tff7b72not Tff7b72in Tb4b4b4(Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTINGTb4b4b4, Te6edf3_ConnectionStateTff7b72.Td2a8ffMQTT_CS_DISCONNECTEDTb4b4b4)
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_thread_terminate
Tff7b72and Te6edf3remaining Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tffa657minTb4b4b4(Te6edf3remainingTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3remaining Tff7b72= Te6edf3target_time Tff7b72- Te6edf3time_funcTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ff_proxy_is_validTb4b4b4(Te6edf3pTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4: T8b949e# type: ignore[no-untyped-def]
Tff7b72def Td2a8ffcheckTb4b4b4(Te6edf3tTb4b4b4, Te6edf3aTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4: T8b949e# type: ignore[no-untyped-def]
Tff7b72return Tb4b4b4(Te6edf3socks Tff7b72is Tff7b72not Tff7b72None Tff7b72and
Te6edf3t Tff7b72in Tb4b4b4{Te6edf3socksTff7b72.Td2a8ffHTTPTb4b4b4, Te6edf3socksTff7b72.Td2a8ffSOCKS4Tb4b4b4, Te6edf3socksTff7b72.Td2a8ffSOCKS5Tb4b4b4} Tff7b72and Te6edf3aTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3pTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3checkTb4b4b4(Te6edf3pTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffproxy_typeTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3pTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffproxy_addrTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3pTb4b4b4, Tb4b4b4(Tffa657listTb4b4b4, Tffa657tupleTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Te6edf3pTb4b4b4) Tff7b72== T79c0ff6 Tff7b72and Te6edf3checkTb4b4b4(Te6edf3pTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3pTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_get_proxyTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3socks Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
T8b949e# First, check if the user explicitly passed us a proxy to use
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_proxy_is_validTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_proxyTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_proxy
T8b949e# Next, check for an mqtt_proxy environment variable as long as the host
T8b949e# we're trying to connect to isn't listed under the no_proxy environment
T8b949e# variable (matches built-in module urllib's behavior)
Tff7b72if Tff7b72not Tb4b4b4(Tffa657hasattrTb4b4b4(Te6edf3urllibTff7b72.Td2a8ffrequestTb4b4b4, Ta5d6ff"Ta5d6ffproxy_bypassTa5d6ff"Tb4b4b4) Tff7b72and
Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffproxy_bypassTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3env_proxies Tff7b72= Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffgetproxiesTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffmqttTa5d6ff" Tff7b72in Te6edf3env_proxiesTb4b4b4:
Te6edf3parts Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffurlparseTb4b4b4(Te6edf3env_proxiesTb4b4b4[Ta5d6ff"Ta5d6ffmqttTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3partsTff7b72.Td2a8ffscheme Tff7b72== Ta5d6ff"Ta5d6ffhttpTa5d6ff"Tb4b4b4:
Te6edf3proxy Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffproxy_typeTa5d6ff"Tb4b4b4: Te6edf3socksTff7b72.Td2a8ffHTTPTb4b4b4,
Ta5d6ff"Ta5d6ffproxy_addrTa5d6ff"Tb4b4b4: Te6edf3partsTff7b72.Td2a8ffhostnameTb4b4b4,
Ta5d6ff"Ta5d6ffproxy_portTa5d6ff"Tb4b4b4: Te6edf3partsTff7b72.Td2a8ffport
Tb4b4b4}
Tff7b72return Te6edf3proxy
Tff7b72elif Te6edf3partsTff7b72.Td2a8ffscheme Tff7b72== Ta5d6ff"Ta5d6ffsocksTa5d6ff"Tb4b4b4:
Te6edf3proxy Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffproxy_typeTa5d6ff"Tb4b4b4: Te6edf3socksTff7b72.Td2a8ffSOCKS5Tb4b4b4,
Ta5d6ff"Ta5d6ffproxy_addrTa5d6ff"Tb4b4b4: Te6edf3partsTff7b72.Td2a8ffhostnameTb4b4b4,
Ta5d6ff"Ta5d6ffproxy_portTa5d6ff"Tb4b4b4: Te6edf3partsTff7b72.Td2a8ffport
Tb4b4b4}
Tff7b72return Te6edf3proxy
T8b949e# Finally, check if the user has monkeypatched the PySocks library with
T8b949e# a default proxy
Te6edf3socks_default Tff7b72= Te6edf3socksTff7b72.Td2a8ffget_default_proxyTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_proxy_is_validTb4b4b4(Te6edf3socks_defaultTb4b4b4)Tb4b4b4:
Te6edf3proxy_keys Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffproxy_typeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffproxy_addrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffproxy_portTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffproxy_rdnsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffproxy_usernameTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffproxy_passwordTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657dictTb4b4b4(Tffa657zipTb4b4b4(Te6edf3proxy_keysTb4b4b4, Te6edf3socks_defaultTb4b4b4)Tb4b4b4)
T8b949e# If we didn't find a proxy through any of the above methods, return
T8b949e# None to indicate that the connection should be handled normally
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_create_socketTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3SocketLikeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_transport Tff7b72== Ta5d6ff"Ta5d6ffunixTa5d6ff"Tb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_unix_socket_connectionTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_socket_connectionTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sslTb4b4b4:
Te6edf3sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_ssl_wrap_socketTb4b4b4(Te6edf3sockTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_transport Tff7b72== Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4:
Te6edf3sockTff7b72.Td2a8ffsettimeoutTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_keepaliveTb4b4b4)
Tff7b72return Te6edf3_WebsocketWrapperTb4b4b4(
Te6edf3socketTff7b72=Te6edf3sockTb4b4b4,
Te6edf3hostTff7b72=Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4,
Te6edf3portTff7b72=Tff7b72selfTff7b72.Td2a8ff_portTb4b4b4,
Te6edf3is_sslTff7b72=Tff7b72selfTff7b72.Td2a8ff_sslTb4b4b4,
Te6edf3pathTff7b72=Tff7b72selfTff7b72.Td2a8ff_websocket_pathTb4b4b4,
Te6edf3extra_headersTff7b72=Tff7b72selfTff7b72.Td2a8ff_websocket_extra_headersTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3sock
Tff7b72def Td2a8ff_create_unix_socket_connectionTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3_socketTff7b72.Td2a8ffsocketTb4b4b4:
Te6edf3unix_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_UNIXTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Te6edf3unix_socketTff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4)
Tff7b72return Te6edf3unix_socket
Tff7b72def Td2a8ff_create_socket_connectionTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3_socketTff7b72.Td2a8ffsocketTb4b4b4:
Te6edf3proxy Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_proxyTb4b4b4(Tb4b4b4)
Te6edf3addr Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_portTb4b4b4)
Te6edf3source Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_bind_addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_bind_portTb4b4b4)
Tff7b72if Te6edf3proxyTb4b4b4:
Tff7b72return Te6edf3socksTff7b72.Td2a8ffcreate_connectionTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ff_connect_timeoutTb4b4b4, Te6edf3source_addressTff7b72=Te6edf3sourceTb4b4b4, Tff7b72*Tff7b72*Te6edf3proxyTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3socketTff7b72.Td2a8ffcreate_connectionTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ff_connect_timeoutTb4b4b4, Te6edf3source_addressTff7b72=Te6edf3sourceTb4b4b4)
Tff7b72def Td2a8ff_ssl_wrap_socketTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tcp_sockTb4b4b4: Te6edf3_socketTff7b72.Td2a8ffsocketTb4b4b4) Tff7b72-Tff7b72> Te6edf3sslTff7b72.Td2a8ffSSLSocketTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_ssl_context Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(
Ta5d6ff"Ta5d6ffImpossible condition. _ssl_context should never be None if _ssl is TrueTa5d6ff"
Tb4b4b4)
Te6edf3verify_host Tff7b72= Tff7b72not Tff7b72selfTff7b72.Td2a8ff_tls_insecure
Tff7b72tryTb4b4b4:
T8b949e# Try with server_hostname, even it's not supported in certain scenarios
Te6edf3ssl_sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_ssl_contextTff7b72.Td2a8ffwrap_socketTb4b4b4(
Te6edf3tcp_sockTb4b4b4,
Te6edf3server_hostnameTff7b72=Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4,
Te6edf3do_handshake_on_connectTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72except Te6edf3sslTff7b72.Td2a8ffCertificateErrorTb4b4b4:
T8b949e# CertificateError is derived from ValueError
Tff7b72raise
Tff7b72except Tf85149ValueErrorTb4b4b4:
T8b949e# Python version requires SNI in order to handle server_hostname, but SNI is not available
Te6edf3ssl_sock Tff7b72= Tff7b72selfTff7b72.Td2a8ff_ssl_contextTff7b72.Td2a8ffwrap_socketTb4b4b4(
Te6edf3tcp_sockTb4b4b4,
Te6edf3do_handshake_on_connectTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# If SSL context has already checked hostname, then don't need to do it again
Tff7b72if Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_ssl_contextTb4b4b4, Ta5d6ff'Ta5d6ffcheck_hostnameTa5d6ff'Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4: T8b949e# type: ignore
Te6edf3verify_host Tff7b72= Tff7b72False
Te6edf3ssl_sockTff7b72.Td2a8ffsettimeoutTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_keepaliveTb4b4b4)
Te6edf3ssl_sockTff7b72.Td2a8ffdo_handshakeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3verify_hostTb4b4b4:
T8b949e# TODO: this type error is a true error:
T8b949e# error: Module has no attribute "match_hostname" [attr-defined]
T8b949e# Python 3.12 no longer have this method.
Te6edf3sslTff7b72.Td2a8ffmatch_hostnameTb4b4b4(Te6edf3ssl_sockTff7b72.Td2a8ffgetpeercertTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_hostTb4b4b4) T8b949e# type: ignore
Tff7b72return Te6edf3ssl_sock
Tff7b72class T56d364_WebsocketWrapperTb4b4b4:
Te6edf3OPCODE_CONTINUATION Tff7b72= T79c0ff0x0
Te6edf3OPCODE_TEXT Tff7b72= T79c0ff0x1
Te6edf3OPCODE_BINARY Tff7b72= T79c0ff0x2
Te6edf3OPCODE_CONNCLOSE Tff7b72= T79c0ff0x8
Te6edf3OPCODE_PING Tff7b72= T79c0ff0x9
Te6edf3OPCODE_PONG Tff7b72= T79c0ff0xa
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3socketTb4b4b4: Te6edf3socketTff7b72.Td2a8ffsocket Tff7b72| Te6edf3sslTff7b72.Td2a8ffSSLSocketTb4b4b4,
Te6edf3hostTb4b4b4: Tffa657strTb4b4b4,
Te6edf3portTb4b4b4: Tffa657intTb4b4b4,
Te6edf3is_sslTb4b4b4: Tffa657boolTb4b4b4,
Te6edf3pathTb4b4b4: Tffa657strTb4b4b4,
Te6edf3extra_headersTb4b4b4: Te6edf3WebSocketHeaders Tff7b72| Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnected Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_ssl Tff7b72= Te6edf3is_ssl
Tff7b72selfTff7b72.Td2a8ff_host Tff7b72= Te6edf3host
Tff7b72selfTff7b72.Td2a8ff_port Tff7b72= Te6edf3port
Tff7b72selfTff7b72.Td2a8ff_socket Tff7b72= Te6edf3socket
Tff7b72selfTff7b72.Td2a8ff_path Tff7b72= Te6edf3path
Tff7b72selfTff7b72.Td2a8ff_sendbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_readbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_requested_size Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_payload_head Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_readbuffer_head Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_do_handshakeTb4b4b4(Te6edf3extra_headersTb4b4b4)
Tff7b72def Tff7b72__del__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sendbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_readbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_do_handshakeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3extra_headersTb4b4b4: Te6edf3WebSocketHeaders Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3sec_websocket_key Tff7b72= Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffbytes
Te6edf3sec_websocket_key Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3sec_websocket_keyTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sslTb4b4b4:
Te6edf3default_port Tff7b72= T79c0ff443
Te6edf3http_schema Tff7b72= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3default_port Tff7b72= T79c0ff80
Te6edf3http_schema Tff7b72= Ta5d6ff"Ta5d6ffhttpTa5d6ff"
Tff7b72if Te6edf3default_port Tff7b72== Tff7b72selfTff7b72.Td2a8ff_portTb4b4b4:
Te6edf3host_port Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ff_hostTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3host_port Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ff_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8ff_portTffd700}Ta5d6ff"
Te6edf3websocket_headers Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffHostTa5d6ff"Tb4b4b4: Te6edf3host_portTb4b4b4,
Ta5d6ff"Ta5d6ffUpgradeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwebsocketTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffConnectionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUpgradeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffOriginTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3http_schemaTffd700}Ta5d6ff://Tffd700{Te6edf3host_portTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffSec-WebSocket-KeyTa5d6ff"Tb4b4b4: Te6edf3sec_websocket_keyTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffSec-Websocket-VersionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff13Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffSec-Websocket-ProtocolTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmqttTa5d6ff"Tb4b4b4,
Tb4b4b4}
T8b949e# This is checked in ws_set_options so it will either be None, a
T8b949e# dictionary, or a callable
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3extra_headersTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3websocket_headersTff7b72.Td2a8ffupdateTb4b4b4(Te6edf3extra_headersTb4b4b4)
Tff7b72elif Tffa657callableTb4b4b4(Te6edf3extra_headersTb4b4b4)Tb4b4b4:
Te6edf3websocket_headers Tff7b72= Te6edf3extra_headersTb4b4b4(Te6edf3websocket_headersTb4b4b4)
Te6edf3header Tff7b72= Ta5d6ff"Tffea00\rTffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[
Ta5d6fffTa5d6ff"Ta5d6ffGET Tffd700{Tff7b72selfTff7b72.Td2a8ff_pathTffd700}Ta5d6ff HTTP/1.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Tffea00\rTffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3iTffd700}Ta5d6ff: Tffd700{Te6edf3jTffd700}Ta5d6ff" Tff7b72for Te6edf3iTb4b4b4, Te6edf3j Tff7b72in Te6edf3websocket_headersTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Tffea00\rTffea00\nTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffsendTb4b4b4(Te6edf3headerTb4b4b4)
Te6edf3has_secret Tff7b72= Tff7b72False
Te6edf3has_upgrade Tff7b72= Tff7b72False
Tff7b72while Tff7b72TrueTb4b4b4:
T8b949e# read HTTP response header as lines
Tff7b72tryTb4b4b4:
Te6edf3byte Tff7b72= Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffrecvTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149ConnectionResetErrorTb4b4b4:
Te6edf3byte Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff_readbufferTff7b72.Td2a8ffextendTb4b4b4(Te6edf3byteTb4b4b4)
T8b949e# line end
Tff7b72if Te6edf3byte Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\nTa5d6ff"Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4) Tff7b72> T79c0ff2Tb4b4b4:
T8b949e# check upgrade
Tff7b72if Ta5d6ffbTa5d6ff"Ta5d6ffconnectionTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ffbTa5d6ff"Ta5d6ffupgradeTa5d6ff" Tff7b72not Tff7b72in Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3WebsocketConnectionErrorTb4b4b4(
Ta5d6ff"Ta5d6ffWebSocket handshake error, connection not upgradedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3has_upgrade Tff7b72= Tff7b72True
T8b949e# check key hash
Tff7b72if Ta5d6ffbTa5d6ff"Ta5d6ffsec-websocket-acceptTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3GUID Tff7b72= Ta5d6ff"Ta5d6ff258EAFA5-E914-47DA-95CA-C5AB0DC85B11Ta5d6ff"
Te6edf3server_hash_str Tff7b72= Tff7b72selfTff7b72.Td2a8ff_readbufferTff7b72.Td2a8ffdecodeTb4b4b4(
Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff: Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3server_hash Tff7b72= Te6edf3server_hash_strTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Te6edf3client_hash_key Tff7b72= Te6edf3sec_websocket_keyTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4) Tff7b72+ Te6edf3GUID
T8b949e# Use of SHA-1 is OK here; it's according to the Websocket spec.
Te6edf3client_hash_digest Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha1Tb4b4b4(Te6edf3client_hash_keyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)Tb4b4b4) T8b949e# noqa: S324
Te6edf3client_hash Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3client_hash_digestTff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3server_hash Tff7b72!= Te6edf3client_hashTb4b4b4:
Tff7b72raise Te6edf3WebsocketConnectionErrorTb4b4b4(
Ta5d6ff"Ta5d6ffWebSocket handshake error, invalid secret keyTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3has_secret Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
T8b949e# ending linebreak
Tff7b72break
T8b949e# reset linebuffer
Tff7b72selfTff7b72.Td2a8ff_readbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
T8b949e# connection reset
Tff7b72elif Tff7b72not Te6edf3byteTb4b4b4:
Tff7b72raise Te6edf3WebsocketConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffWebSocket handshake errorTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3has_upgrade Tff7b72or Tff7b72not Te6edf3has_secretTb4b4b4:
Tff7b72raise Te6edf3WebsocketConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffWebSocket handshake errorTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_readbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconnected Tff7b72= Tff7b72True
Tff7b72def Td2a8ff_create_frameTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3opcodeTb4b4b4: Tffa657intTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytearrayTb4b4b4, Te6edf3do_maskingTb4b4b4: Tffa657int Tff7b72= T79c0ff1
Tb4b4b4) Tff7b72-Tff7b72> Tffa657bytearrayTb4b4b4:
Te6edf3header Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Te6edf3length Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3mask_key Tff7b72= Tffa657bytearrayTb4b4b4(Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4)
Te6edf3mask_flag Tff7b72= Te6edf3do_masking
T8b949e# 1 << 7 is the final flag, we don't send continuated data
Te6edf3headerTff7b72.Td2a8ffappendTb4b4b4(T79c0ff1 Tff7b72<< T79c0ff7 Tff7b72| Te6edf3opcodeTb4b4b4)
Tff7b72if Te6edf3length Tff7b72< T79c0ff126Tb4b4b4:
Te6edf3headerTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mask_flag Tff7b72<< T79c0ff7 Tff7b72| Te6edf3lengthTb4b4b4)
Tff7b72elif Te6edf3length Tff7b72< T79c0ff65536Tb4b4b4:
Te6edf3headerTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mask_flag Tff7b72<< T79c0ff7 Tff7b72| T79c0ff126Tb4b4b4)
Te6edf3header Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)
Tff7b72elif Te6edf3length Tff7b72< T79c0ff0x8000000000000001Tb4b4b4:
Te6edf3headerTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mask_flag Tff7b72<< T79c0ff7 Tff7b72| T79c0ff127Tb4b4b4)
Te6edf3header Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff!QTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffMaximum payload size is 2^63Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3mask_flag Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72for Te6edf3index Tff7b72in Tffa657rangeTb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4:
Te6edf3dataTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72^Tff7b72= Te6edf3mask_keyTb4b4b4[Te6edf3index Tff7b72% T79c0ff4Tb4b4b4]
Te6edf3data Tff7b72= Te6edf3mask_key Tff7b72+ Te6edf3data
Tff7b72return Te6edf3header Tff7b72+ Te6edf3data
Tff7b72def Td2a8ff_buffered_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lengthTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytearrayTb4b4b4:
T8b949e# try to recv and store needed bytes
Te6edf3wanted_bytes Tff7b72= Te6edf3length Tff7b72- Tb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ff_readbuffer_headTb4b4b4)
Tff7b72if Te6edf3wanted_bytes Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffrecvTb4b4b4(Te6edf3wanted_bytesTb4b4b4)
Tff7b72if Tff7b72not Te6edf3dataTb4b4b4:
Tff7b72raise Tf85149ConnectionAbortedError
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_readbufferTff7b72.Td2a8ffextendTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72< Te6edf3wanted_bytesTb4b4b4:
Tff7b72raise Tf85149BlockingIOError
Tff7b72selfTff7b72.Td2a8ff_readbuffer_head Tff7b72+Tff7b72= Te6edf3length
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_readbufferTb4b4b4[Tff7b72selfTff7b72.Td2a8ff_readbuffer_head Tff7b72- Te6edf3lengthTb4b4b4:Tff7b72selfTff7b72.Td2a8ff_readbuffer_headTb4b4b4]
Tff7b72def Td2a8ff_recv_implTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lengthTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
T8b949e# try to decode websocket payload part from data
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_readbuffer_head Tff7b72= T79c0ff0
Te6edf3result Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3chunk_startindex Tff7b72= Tff7b72selfTff7b72.Td2a8ff_payload_head
Te6edf3chunk_endindex Tff7b72= Tff7b72selfTff7b72.Td2a8ff_payload_head Tff7b72+ Te6edf3length
Te6edf3header1 Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3header2 Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3opcode Tff7b72= Tb4b4b4(Te6edf3header1Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x0fTb4b4b4)
Te6edf3maskbit Tff7b72= Tb4b4b4(Te6edf3header2Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x80Tb4b4b4) Tff7b72== T79c0ff0x80
Te6edf3lengthbits Tff7b72= Tb4b4b4(Te6edf3header2Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72& T79c0ff0x7fTb4b4b4)
Te6edf3payload_length Tff7b72= Te6edf3lengthbits
Te6edf3mask_key Tff7b72= Tff7b72None
T8b949e# read length
Tff7b72if Te6edf3lengthbits Tff7b72== T79c0ff0x7eTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3payload_lengthTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!HTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72elif Te6edf3lengthbits Tff7b72== T79c0ff0x7fTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(T79c0ff8Tb4b4b4)
Te6edf3payload_lengthTb4b4b4, Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Ta5d6ff"Ta5d6ff!QTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4)
T8b949e# read mask
Tff7b72if Te6edf3maskbitTb4b4b4:
Te6edf3mask_key Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(T79c0ff4Tb4b4b4)
T8b949e# if frame payload is shorter than the requested data, read only the possible part
Te6edf3readindex Tff7b72= Te6edf3chunk_endindex
Tff7b72if Te6edf3payload_length Tff7b72< Te6edf3readindexTb4b4b4:
Te6edf3readindex Tff7b72= Te6edf3payload_length
Tff7b72if Te6edf3readindex Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# get payload chunk
Te6edf3payload Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buffered_readTb4b4b4(Te6edf3readindexTb4b4b4)
T8b949e# unmask only the needed part
Tff7b72if Te6edf3mask_key Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3index Tff7b72in Tffa657rangeTb4b4b4(Te6edf3chunk_startindexTb4b4b4, Te6edf3readindexTb4b4b4)Tb4b4b4:
Te6edf3payloadTb4b4b4[Te6edf3indexTb4b4b4] Tff7b72^Tff7b72= Te6edf3mask_keyTb4b4b4[Te6edf3index Tff7b72% T79c0ff4Tb4b4b4]
Te6edf3result Tff7b72= Te6edf3payloadTb4b4b4[Te6edf3chunk_startindexTb4b4b4:Te6edf3readindexTb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_payload_head Tff7b72= Te6edf3readindex
Tff7b72elseTb4b4b4:
Te6edf3payload Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
T8b949e# check if full frame arrived and reset readbuffer and payloadhead if needed
Tff7b72if Te6edf3readindex Tff7b72== Te6edf3payload_lengthTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_readbuffer Tff7b72= Tffa657bytearrayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_payload_head Tff7b72= T79c0ff0
T8b949e# respond to non-binary opcodes, their arrival is not guaranteed because of non-blocking sockets
Tff7b72if Te6edf3opcode Tff7b72== Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_CONNCLOSETb4b4b4:
Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_frameTb4b4b4(
Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_CONNCLOSETb4b4b4, Te6edf3payloadTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffsendTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72if Te6edf3opcode Tff7b72== Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_PINGTb4b4b4:
Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_frameTb4b4b4(
Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_PONGTb4b4b4, Te6edf3payloadTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffsendTb4b4b4(Te6edf3frameTb4b4b4)
T8b949e# This isn't *proper* handling of continuation frames, but given
T8b949e# that we only support binary frames, it is *probably* good enough.
Tff7b72if Tb4b4b4(Te6edf3opcode Tff7b72== Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_BINARY Tff7b72or Te6edf3opcode Tff7b72== Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_CONTINUATIONTb4b4b4) \
Tff7b72and Te6edf3payload_length Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3result
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149BlockingIOError
Tff7b72except Tf85149ConnectionErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnected Tff7b72= Tff7b72False
Tff7b72return Ta5d6ffbTa5d6ff'Ta5d6ff'
Tff7b72def Td2a8ff_send_implTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e# if previous frame was sent successfully
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sendbufferTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# create websocket frame
Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_frameTb4b4b4(
Te6edf3_WebsocketWrapperTff7b72.Td2a8ffOPCODE_BINARYTb4b4b4, Tffa657bytearrayTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sendbufferTff7b72.Td2a8ffextendTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_requested_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
T8b949e# try to write out as much as possible
Te6edf3length Tff7b72= Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffsendTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sendbufferTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sendbuffer Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sendbufferTb4b4b4[Te6edf3lengthTb4b4b4:Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sendbufferTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# buffer sent out completely, return with payload's size
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_requested_size
Tff7b72elseTb4b4b4:
T8b949e# couldn't send whole data, request the same data again with 0 as sent length
Tff7b72return T79c0ff0
Tff7b72def Td2a8ffrecvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lengthTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_recv_implTb4b4b4(Te6edf3lengthTb4b4b4)
Tff7b72def Td2a8ffreadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lengthTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_recv_implTb4b4b4(Te6edf3lengthTb4b4b4)
Tff7b72def Td2a8ffsendTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_implTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ffwriteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_send_implTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ffcloseTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fffilenoTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpendingTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
T8b949e# Fix for bug #131: a SSL socket may still have data available
T8b949e# for reading without select() being aware of it.
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_sslTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffpendingTb4b4b4(Tb4b4b4) T8b949e# type: ignore[union-attr]
Tff7b72elseTb4b4b4:
T8b949e# normal socket rely only on select()
Tff7b72return T79c0ff0
Tff7b72def Td2a8ffsetblockingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3flagTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_socketTff7b72.Td2a8ffsetblockingTb4b4b4(Te6edf3flagTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────